/**
 * Autogenerated by Thrift Compiler (0.10.0)
 *
 * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
 *  @generated
 */
package org.apache.airavata.allocation.manager.models;

@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"})
/**
 * <p>Required allocation request details</p>
 * <li>id : (primary key) Ask the user to assign project ID, but this project should unique, we will need an API endpoint to check whether this ID is not used by other projects and the username</li>
 * <li>applicationsToBeUsed : Select the application that the user intends to use, according to application chosen here, resources that can be allocable will be fetch from resource discovery module. User will not be restricted to these application upon allocation grant, provided the resources allocated support the application.</li>
 * <li>diskUsageRangePerJob : An optional field to help reviewer and PI for allocation approval</li>
 * <li>documents : Resume, CV, PI’s portfolio etc</li>
 * <li>fieldOfScience :An optional field to help reviewer and PI for allocation approval</li>
 * <li>keywords : Keyword will be helpful in search</li>
 * <li>maxMemoryPerCpu :An optional field to help reviewer and PI for allocation approval</li>
 * <li>numberOfCpuPerJob : An optional field to help reviewer and PI for allocation approval</li>
 * <li>projectDescription :(Eg: Hypothesis, Model Systems, Methods, and Analysis)</li>
 * <li>projectReviewedAndFundedBy : (Eg., NSF, NIH, DOD, DOE, None etc...). An optional field to help reviewer and PI for allocation approval</li>
 * <li>requestedDate: The date the allocation was requested</li>
 * <li>serviceUnits : 1 SU is approximately 1 workstation CPU hour, if the user fails to give a value, default value will be chosen.</li>
 * <li>specificResourceSelection : This list will be fetched from resource discovery module, in case of community allocation, the request is subject to reviewers, PI discretion and availability</li>
 * <li>title : Assign a title to allocation request</li>
 * <li>typeOfAllocation : If the User has an exclusive allocation with third party organization and wants to use airavata middleware to manage jobs.</li>
 * <li>typicalSuPerJob :  An optional field to help reviewer and PI for allocation approval</li>
 * 
 */
@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.10.0)")
public class UserAllocationDetail implements org.apache.thrift.TBase<UserAllocationDetail, UserAllocationDetail._Fields>, java.io.Serializable, Cloneable, Comparable<UserAllocationDetail> {
  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("UserAllocationDetail");

  private static final org.apache.thrift.protocol.TField ID_FIELD_DESC = new org.apache.thrift.protocol.TField("id", org.apache.thrift.protocol.TType.STRUCT, (short)1);
  private static final org.apache.thrift.protocol.TField APPLICATIONS_TO_BE_USED_FIELD_DESC = new org.apache.thrift.protocol.TField("applicationsToBeUsed", org.apache.thrift.protocol.TType.STRING, (short)2);
  private static final org.apache.thrift.protocol.TField DISK_USAGE_RANGE_PER_JOB_FIELD_DESC = new org.apache.thrift.protocol.TField("diskUsageRangePerJob", org.apache.thrift.protocol.TType.I64, (short)3);
  private static final org.apache.thrift.protocol.TField DOCUMENTS_FIELD_DESC = new org.apache.thrift.protocol.TField("documents", org.apache.thrift.protocol.TType.STRING, (short)4);
  private static final org.apache.thrift.protocol.TField FIELD_OF_SCIENCE_FIELD_DESC = new org.apache.thrift.protocol.TField("fieldOfScience", org.apache.thrift.protocol.TType.STRING, (short)5);
  private static final org.apache.thrift.protocol.TField KEYWORDS_FIELD_DESC = new org.apache.thrift.protocol.TField("keywords", org.apache.thrift.protocol.TType.STRING, (short)6);
  private static final org.apache.thrift.protocol.TField MAX_MEMORY_PER_CPU_FIELD_DESC = new org.apache.thrift.protocol.TField("maxMemoryPerCpu", org.apache.thrift.protocol.TType.I64, (short)7);
  private static final org.apache.thrift.protocol.TField NUMBER_OF_CPU_PER_JOB_FIELD_DESC = new org.apache.thrift.protocol.TField("numberOfCpuPerJob", org.apache.thrift.protocol.TType.I64, (short)8);
  private static final org.apache.thrift.protocol.TField PROJECT_DESCRIPTION_FIELD_DESC = new org.apache.thrift.protocol.TField("projectDescription", org.apache.thrift.protocol.TType.STRING, (short)9);
  private static final org.apache.thrift.protocol.TField PROJECT_REVIEWED_AND_FUNDED_BY_FIELD_DESC = new org.apache.thrift.protocol.TField("projectReviewedAndFundedBy", org.apache.thrift.protocol.TType.STRING, (short)10);
  private static final org.apache.thrift.protocol.TField REQUESTED_DATE_FIELD_DESC = new org.apache.thrift.protocol.TField("requestedDate", org.apache.thrift.protocol.TType.I64, (short)11);
  private static final org.apache.thrift.protocol.TField SERVICE_UNITS_FIELD_DESC = new org.apache.thrift.protocol.TField("serviceUnits", org.apache.thrift.protocol.TType.I64, (short)12);
  private static final org.apache.thrift.protocol.TField SPECIFIC_RESOURCE_SELECTION_FIELD_DESC = new org.apache.thrift.protocol.TField("specificResourceSelection", org.apache.thrift.protocol.TType.STRING, (short)13);
  private static final org.apache.thrift.protocol.TField TITLE_FIELD_DESC = new org.apache.thrift.protocol.TField("title", org.apache.thrift.protocol.TType.STRING, (short)14);
  private static final org.apache.thrift.protocol.TField TYPE_OF_ALLOCATION_FIELD_DESC = new org.apache.thrift.protocol.TField("typeOfAllocation", org.apache.thrift.protocol.TType.STRING, (short)15);
  private static final org.apache.thrift.protocol.TField TYPICAL_SU_PER_JOB_FIELD_DESC = new org.apache.thrift.protocol.TField("typicalSuPerJob", org.apache.thrift.protocol.TType.I64, (short)16);
  private static final org.apache.thrift.protocol.TField AWARD_ALLOCATION_FIELD_DESC = new org.apache.thrift.protocol.TField("awardAllocation", org.apache.thrift.protocol.TType.I64, (short)17);
  private static final org.apache.thrift.protocol.TField START_DATE_FIELD_DESC = new org.apache.thrift.protocol.TField("startDate", org.apache.thrift.protocol.TType.I64, (short)18);
  private static final org.apache.thrift.protocol.TField END_DATE_FIELD_DESC = new org.apache.thrift.protocol.TField("endDate", org.apache.thrift.protocol.TType.I64, (short)19);
  private static final org.apache.thrift.protocol.TField STATUS_FIELD_DESC = new org.apache.thrift.protocol.TField("status", org.apache.thrift.protocol.TType.STRING, (short)20);
  private static final org.apache.thrift.protocol.TField IS_PRIMARY_OWNER_FIELD_DESC = new org.apache.thrift.protocol.TField("isPrimaryOwner", org.apache.thrift.protocol.TType.BOOL, (short)21);

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

  public UserAllocationDetailPK id; // optional
  public java.lang.String applicationsToBeUsed; // optional
  public long diskUsageRangePerJob; // optional
  public java.nio.ByteBuffer documents; // optional
  public java.lang.String fieldOfScience; // optional
  public java.lang.String keywords; // optional
  public long maxMemoryPerCpu; // optional
  public long numberOfCpuPerJob; // optional
  public java.lang.String projectDescription; // optional
  public java.lang.String projectReviewedAndFundedBy; // optional
  public long requestedDate; // optional
  public long serviceUnits; // optional
  public java.lang.String specificResourceSelection; // optional
  public java.lang.String title; // optional
  public java.lang.String typeOfAllocation; // optional
  public long typicalSuPerJob; // optional
  public long awardAllocation; // optional
  public long startDate; // optional
  public long endDate; // optional
  public java.lang.String status; // optional
  public boolean isPrimaryOwner; // 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 {
    ID((short)1, "id"),
    APPLICATIONS_TO_BE_USED((short)2, "applicationsToBeUsed"),
    DISK_USAGE_RANGE_PER_JOB((short)3, "diskUsageRangePerJob"),
    DOCUMENTS((short)4, "documents"),
    FIELD_OF_SCIENCE((short)5, "fieldOfScience"),
    KEYWORDS((short)6, "keywords"),
    MAX_MEMORY_PER_CPU((short)7, "maxMemoryPerCpu"),
    NUMBER_OF_CPU_PER_JOB((short)8, "numberOfCpuPerJob"),
    PROJECT_DESCRIPTION((short)9, "projectDescription"),
    PROJECT_REVIEWED_AND_FUNDED_BY((short)10, "projectReviewedAndFundedBy"),
    REQUESTED_DATE((short)11, "requestedDate"),
    SERVICE_UNITS((short)12, "serviceUnits"),
    SPECIFIC_RESOURCE_SELECTION((short)13, "specificResourceSelection"),
    TITLE((short)14, "title"),
    TYPE_OF_ALLOCATION((short)15, "typeOfAllocation"),
    TYPICAL_SU_PER_JOB((short)16, "typicalSuPerJob"),
    AWARD_ALLOCATION((short)17, "awardAllocation"),
    START_DATE((short)18, "startDate"),
    END_DATE((short)19, "endDate"),
    STATUS((short)20, "status"),
    IS_PRIMARY_OWNER((short)21, "isPrimaryOwner");

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

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

    /**
     * Find the _Fields constant that matches fieldId, or null if its not found.
     */
    public static _Fields findByThriftId(int fieldId) {
      switch(fieldId) {
        case 1: // ID
          return ID;
        case 2: // APPLICATIONS_TO_BE_USED
          return APPLICATIONS_TO_BE_USED;
        case 3: // DISK_USAGE_RANGE_PER_JOB
          return DISK_USAGE_RANGE_PER_JOB;
        case 4: // DOCUMENTS
          return DOCUMENTS;
        case 5: // FIELD_OF_SCIENCE
          return FIELD_OF_SCIENCE;
        case 6: // KEYWORDS
          return KEYWORDS;
        case 7: // MAX_MEMORY_PER_CPU
          return MAX_MEMORY_PER_CPU;
        case 8: // NUMBER_OF_CPU_PER_JOB
          return NUMBER_OF_CPU_PER_JOB;
        case 9: // PROJECT_DESCRIPTION
          return PROJECT_DESCRIPTION;
        case 10: // PROJECT_REVIEWED_AND_FUNDED_BY
          return PROJECT_REVIEWED_AND_FUNDED_BY;
        case 11: // REQUESTED_DATE
          return REQUESTED_DATE;
        case 12: // SERVICE_UNITS
          return SERVICE_UNITS;
        case 13: // SPECIFIC_RESOURCE_SELECTION
          return SPECIFIC_RESOURCE_SELECTION;
        case 14: // TITLE
          return TITLE;
        case 15: // TYPE_OF_ALLOCATION
          return TYPE_OF_ALLOCATION;
        case 16: // TYPICAL_SU_PER_JOB
          return TYPICAL_SU_PER_JOB;
        case 17: // AWARD_ALLOCATION
          return AWARD_ALLOCATION;
        case 18: // START_DATE
          return START_DATE;
        case 19: // END_DATE
          return END_DATE;
        case 20: // STATUS
          return STATUS;
        case 21: // IS_PRIMARY_OWNER
          return IS_PRIMARY_OWNER;
        default:
          return null;
      }
    }

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

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

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

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

    public short getThriftFieldId() {
      return _thriftId;
    }

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

  // isset id assignments
  private static final int __DISKUSAGERANGEPERJOB_ISSET_ID = 0;
  private static final int __MAXMEMORYPERCPU_ISSET_ID = 1;
  private static final int __NUMBEROFCPUPERJOB_ISSET_ID = 2;
  private static final int __REQUESTEDDATE_ISSET_ID = 3;
  private static final int __SERVICEUNITS_ISSET_ID = 4;
  private static final int __TYPICALSUPERJOB_ISSET_ID = 5;
  private static final int __AWARDALLOCATION_ISSET_ID = 6;
  private static final int __STARTDATE_ISSET_ID = 7;
  private static final int __ENDDATE_ISSET_ID = 8;
  private static final int __ISPRIMARYOWNER_ISSET_ID = 9;
  private short __isset_bitfield = 0;
  private static final _Fields optionals[] = {_Fields.ID,_Fields.APPLICATIONS_TO_BE_USED,_Fields.DISK_USAGE_RANGE_PER_JOB,_Fields.DOCUMENTS,_Fields.FIELD_OF_SCIENCE,_Fields.KEYWORDS,_Fields.MAX_MEMORY_PER_CPU,_Fields.NUMBER_OF_CPU_PER_JOB,_Fields.PROJECT_DESCRIPTION,_Fields.PROJECT_REVIEWED_AND_FUNDED_BY,_Fields.REQUESTED_DATE,_Fields.SERVICE_UNITS,_Fields.SPECIFIC_RESOURCE_SELECTION,_Fields.TITLE,_Fields.TYPE_OF_ALLOCATION,_Fields.TYPICAL_SU_PER_JOB,_Fields.AWARD_ALLOCATION,_Fields.START_DATE,_Fields.END_DATE,_Fields.STATUS,_Fields.IS_PRIMARY_OWNER};
  public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
  static {
    java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
    tmpMap.put(_Fields.ID, new org.apache.thrift.meta_data.FieldMetaData("id", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, UserAllocationDetailPK.class)));
    tmpMap.put(_Fields.APPLICATIONS_TO_BE_USED, new org.apache.thrift.meta_data.FieldMetaData("applicationsToBeUsed", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.DISK_USAGE_RANGE_PER_JOB, new org.apache.thrift.meta_data.FieldMetaData("diskUsageRangePerJob", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
    tmpMap.put(_Fields.DOCUMENTS, new org.apache.thrift.meta_data.FieldMetaData("documents", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING        , true)));
    tmpMap.put(_Fields.FIELD_OF_SCIENCE, new org.apache.thrift.meta_data.FieldMetaData("fieldOfScience", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.KEYWORDS, new org.apache.thrift.meta_data.FieldMetaData("keywords", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.MAX_MEMORY_PER_CPU, new org.apache.thrift.meta_data.FieldMetaData("maxMemoryPerCpu", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
    tmpMap.put(_Fields.NUMBER_OF_CPU_PER_JOB, new org.apache.thrift.meta_data.FieldMetaData("numberOfCpuPerJob", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
    tmpMap.put(_Fields.PROJECT_DESCRIPTION, new org.apache.thrift.meta_data.FieldMetaData("projectDescription", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.PROJECT_REVIEWED_AND_FUNDED_BY, new org.apache.thrift.meta_data.FieldMetaData("projectReviewedAndFundedBy", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.REQUESTED_DATE, new org.apache.thrift.meta_data.FieldMetaData("requestedDate", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
    tmpMap.put(_Fields.SERVICE_UNITS, new org.apache.thrift.meta_data.FieldMetaData("serviceUnits", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
    tmpMap.put(_Fields.SPECIFIC_RESOURCE_SELECTION, new org.apache.thrift.meta_data.FieldMetaData("specificResourceSelection", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.TITLE, new org.apache.thrift.meta_data.FieldMetaData("title", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.TYPE_OF_ALLOCATION, new org.apache.thrift.meta_data.FieldMetaData("typeOfAllocation", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.TYPICAL_SU_PER_JOB, new org.apache.thrift.meta_data.FieldMetaData("typicalSuPerJob", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
    tmpMap.put(_Fields.AWARD_ALLOCATION, new org.apache.thrift.meta_data.FieldMetaData("awardAllocation", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
    tmpMap.put(_Fields.START_DATE, new org.apache.thrift.meta_data.FieldMetaData("startDate", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
    tmpMap.put(_Fields.END_DATE, new org.apache.thrift.meta_data.FieldMetaData("endDate", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
    tmpMap.put(_Fields.STATUS, new org.apache.thrift.meta_data.FieldMetaData("status", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.IS_PRIMARY_OWNER, new org.apache.thrift.meta_data.FieldMetaData("isPrimaryOwner", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL)));
    metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(UserAllocationDetail.class, metaDataMap);
  }

  public UserAllocationDetail() {
  }

  /**
   * Performs a deep copy on <i>other</i>.
   */
  public UserAllocationDetail(UserAllocationDetail other) {
    __isset_bitfield = other.__isset_bitfield;
    if (other.isSetId()) {
      this.id = new UserAllocationDetailPK(other.id);
    }
    if (other.isSetApplicationsToBeUsed()) {
      this.applicationsToBeUsed = other.applicationsToBeUsed;
    }
    this.diskUsageRangePerJob = other.diskUsageRangePerJob;
    if (other.isSetDocuments()) {
      this.documents = org.apache.thrift.TBaseHelper.copyBinary(other.documents);
    }
    if (other.isSetFieldOfScience()) {
      this.fieldOfScience = other.fieldOfScience;
    }
    if (other.isSetKeywords()) {
      this.keywords = other.keywords;
    }
    this.maxMemoryPerCpu = other.maxMemoryPerCpu;
    this.numberOfCpuPerJob = other.numberOfCpuPerJob;
    if (other.isSetProjectDescription()) {
      this.projectDescription = other.projectDescription;
    }
    if (other.isSetProjectReviewedAndFundedBy()) {
      this.projectReviewedAndFundedBy = other.projectReviewedAndFundedBy;
    }
    this.requestedDate = other.requestedDate;
    this.serviceUnits = other.serviceUnits;
    if (other.isSetSpecificResourceSelection()) {
      this.specificResourceSelection = other.specificResourceSelection;
    }
    if (other.isSetTitle()) {
      this.title = other.title;
    }
    if (other.isSetTypeOfAllocation()) {
      this.typeOfAllocation = other.typeOfAllocation;
    }
    this.typicalSuPerJob = other.typicalSuPerJob;
    this.awardAllocation = other.awardAllocation;
    this.startDate = other.startDate;
    this.endDate = other.endDate;
    if (other.isSetStatus()) {
      this.status = other.status;
    }
    this.isPrimaryOwner = other.isPrimaryOwner;
  }

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

  @Override
  public void clear() {
    this.id = null;
    this.applicationsToBeUsed = null;
    setDiskUsageRangePerJobIsSet(false);
    this.diskUsageRangePerJob = 0;
    this.documents = null;
    this.fieldOfScience = null;
    this.keywords = null;
    setMaxMemoryPerCpuIsSet(false);
    this.maxMemoryPerCpu = 0;
    setNumberOfCpuPerJobIsSet(false);
    this.numberOfCpuPerJob = 0;
    this.projectDescription = null;
    this.projectReviewedAndFundedBy = null;
    setRequestedDateIsSet(false);
    this.requestedDate = 0;
    setServiceUnitsIsSet(false);
    this.serviceUnits = 0;
    this.specificResourceSelection = null;
    this.title = null;
    this.typeOfAllocation = null;
    setTypicalSuPerJobIsSet(false);
    this.typicalSuPerJob = 0;
    setAwardAllocationIsSet(false);
    this.awardAllocation = 0;
    setStartDateIsSet(false);
    this.startDate = 0;
    setEndDateIsSet(false);
    this.endDate = 0;
    this.status = null;
    setIsPrimaryOwnerIsSet(false);
    this.isPrimaryOwner = false;
  }

  public UserAllocationDetailPK getId() {
    return this.id;
  }

  public UserAllocationDetail setId(UserAllocationDetailPK id) {
    this.id = id;
    return this;
  }

  public void unsetId() {
    this.id = null;
  }

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

  public void setIdIsSet(boolean value) {
    if (!value) {
      this.id = null;
    }
  }

  public java.lang.String getApplicationsToBeUsed() {
    return this.applicationsToBeUsed;
  }

  public UserAllocationDetail setApplicationsToBeUsed(java.lang.String applicationsToBeUsed) {
    this.applicationsToBeUsed = applicationsToBeUsed;
    return this;
  }

  public void unsetApplicationsToBeUsed() {
    this.applicationsToBeUsed = null;
  }

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

  public void setApplicationsToBeUsedIsSet(boolean value) {
    if (!value) {
      this.applicationsToBeUsed = null;
    }
  }

  public long getDiskUsageRangePerJob() {
    return this.diskUsageRangePerJob;
  }

  public UserAllocationDetail setDiskUsageRangePerJob(long diskUsageRangePerJob) {
    this.diskUsageRangePerJob = diskUsageRangePerJob;
    setDiskUsageRangePerJobIsSet(true);
    return this;
  }

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

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

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

  public byte[] getDocuments() {
    setDocuments(org.apache.thrift.TBaseHelper.rightSize(documents));
    return documents == null ? null : documents.array();
  }

  public java.nio.ByteBuffer bufferForDocuments() {
    return org.apache.thrift.TBaseHelper.copyBinary(documents);
  }

  public UserAllocationDetail setDocuments(byte[] documents) {
    this.documents = documents == null ? (java.nio.ByteBuffer)null : java.nio.ByteBuffer.wrap(documents.clone());
    return this;
  }

  public UserAllocationDetail setDocuments(java.nio.ByteBuffer documents) {
    this.documents = org.apache.thrift.TBaseHelper.copyBinary(documents);
    return this;
  }

  public void unsetDocuments() {
    this.documents = null;
  }

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

  public void setDocumentsIsSet(boolean value) {
    if (!value) {
      this.documents = null;
    }
  }

  public java.lang.String getFieldOfScience() {
    return this.fieldOfScience;
  }

  public UserAllocationDetail setFieldOfScience(java.lang.String fieldOfScience) {
    this.fieldOfScience = fieldOfScience;
    return this;
  }

  public void unsetFieldOfScience() {
    this.fieldOfScience = null;
  }

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

  public void setFieldOfScienceIsSet(boolean value) {
    if (!value) {
      this.fieldOfScience = null;
    }
  }

  public java.lang.String getKeywords() {
    return this.keywords;
  }

  public UserAllocationDetail setKeywords(java.lang.String keywords) {
    this.keywords = keywords;
    return this;
  }

  public void unsetKeywords() {
    this.keywords = null;
  }

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

  public void setKeywordsIsSet(boolean value) {
    if (!value) {
      this.keywords = null;
    }
  }

  public long getMaxMemoryPerCpu() {
    return this.maxMemoryPerCpu;
  }

  public UserAllocationDetail setMaxMemoryPerCpu(long maxMemoryPerCpu) {
    this.maxMemoryPerCpu = maxMemoryPerCpu;
    setMaxMemoryPerCpuIsSet(true);
    return this;
  }

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

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

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

  public long getNumberOfCpuPerJob() {
    return this.numberOfCpuPerJob;
  }

  public UserAllocationDetail setNumberOfCpuPerJob(long numberOfCpuPerJob) {
    this.numberOfCpuPerJob = numberOfCpuPerJob;
    setNumberOfCpuPerJobIsSet(true);
    return this;
  }

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

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

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

  public java.lang.String getProjectDescription() {
    return this.projectDescription;
  }

  public UserAllocationDetail setProjectDescription(java.lang.String projectDescription) {
    this.projectDescription = projectDescription;
    return this;
  }

  public void unsetProjectDescription() {
    this.projectDescription = null;
  }

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

  public void setProjectDescriptionIsSet(boolean value) {
    if (!value) {
      this.projectDescription = null;
    }
  }

  public java.lang.String getProjectReviewedAndFundedBy() {
    return this.projectReviewedAndFundedBy;
  }

  public UserAllocationDetail setProjectReviewedAndFundedBy(java.lang.String projectReviewedAndFundedBy) {
    this.projectReviewedAndFundedBy = projectReviewedAndFundedBy;
    return this;
  }

  public void unsetProjectReviewedAndFundedBy() {
    this.projectReviewedAndFundedBy = null;
  }

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

  public void setProjectReviewedAndFundedByIsSet(boolean value) {
    if (!value) {
      this.projectReviewedAndFundedBy = null;
    }
  }

  public long getRequestedDate() {
    return this.requestedDate;
  }

  public UserAllocationDetail setRequestedDate(long requestedDate) {
    this.requestedDate = requestedDate;
    setRequestedDateIsSet(true);
    return this;
  }

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

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

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

  public long getServiceUnits() {
    return this.serviceUnits;
  }

  public UserAllocationDetail setServiceUnits(long serviceUnits) {
    this.serviceUnits = serviceUnits;
    setServiceUnitsIsSet(true);
    return this;
  }

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

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

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

  public java.lang.String getSpecificResourceSelection() {
    return this.specificResourceSelection;
  }

  public UserAllocationDetail setSpecificResourceSelection(java.lang.String specificResourceSelection) {
    this.specificResourceSelection = specificResourceSelection;
    return this;
  }

  public void unsetSpecificResourceSelection() {
    this.specificResourceSelection = null;
  }

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

  public void setSpecificResourceSelectionIsSet(boolean value) {
    if (!value) {
      this.specificResourceSelection = null;
    }
  }

  public java.lang.String getTitle() {
    return this.title;
  }

  public UserAllocationDetail setTitle(java.lang.String title) {
    this.title = title;
    return this;
  }

  public void unsetTitle() {
    this.title = null;
  }

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

  public void setTitleIsSet(boolean value) {
    if (!value) {
      this.title = null;
    }
  }

  public java.lang.String getTypeOfAllocation() {
    return this.typeOfAllocation;
  }

  public UserAllocationDetail setTypeOfAllocation(java.lang.String typeOfAllocation) {
    this.typeOfAllocation = typeOfAllocation;
    return this;
  }

  public void unsetTypeOfAllocation() {
    this.typeOfAllocation = null;
  }

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

  public void setTypeOfAllocationIsSet(boolean value) {
    if (!value) {
      this.typeOfAllocation = null;
    }
  }

  public long getTypicalSuPerJob() {
    return this.typicalSuPerJob;
  }

  public UserAllocationDetail setTypicalSuPerJob(long typicalSuPerJob) {
    this.typicalSuPerJob = typicalSuPerJob;
    setTypicalSuPerJobIsSet(true);
    return this;
  }

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

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

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

  public long getAwardAllocation() {
    return this.awardAllocation;
  }

  public UserAllocationDetail setAwardAllocation(long awardAllocation) {
    this.awardAllocation = awardAllocation;
    setAwardAllocationIsSet(true);
    return this;
  }

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

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

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

  public long getStartDate() {
    return this.startDate;
  }

  public UserAllocationDetail setStartDate(long startDate) {
    this.startDate = startDate;
    setStartDateIsSet(true);
    return this;
  }

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

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

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

  public long getEndDate() {
    return this.endDate;
  }

  public UserAllocationDetail setEndDate(long endDate) {
    this.endDate = endDate;
    setEndDateIsSet(true);
    return this;
  }

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

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

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

  public java.lang.String getStatus() {
    return this.status;
  }

  public UserAllocationDetail setStatus(java.lang.String status) {
    this.status = status;
    return this;
  }

  public void unsetStatus() {
    this.status = null;
  }

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

  public void setStatusIsSet(boolean value) {
    if (!value) {
      this.status = null;
    }
  }

  public boolean isIsPrimaryOwner() {
    return this.isPrimaryOwner;
  }

  public UserAllocationDetail setIsPrimaryOwner(boolean isPrimaryOwner) {
    this.isPrimaryOwner = isPrimaryOwner;
    setIsPrimaryOwnerIsSet(true);
    return this;
  }

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

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

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

  public void setFieldValue(_Fields field, java.lang.Object value) {
    switch (field) {
    case ID:
      if (value == null) {
        unsetId();
      } else {
        setId((UserAllocationDetailPK)value);
      }
      break;

    case APPLICATIONS_TO_BE_USED:
      if (value == null) {
        unsetApplicationsToBeUsed();
      } else {
        setApplicationsToBeUsed((java.lang.String)value);
      }
      break;

    case DISK_USAGE_RANGE_PER_JOB:
      if (value == null) {
        unsetDiskUsageRangePerJob();
      } else {
        setDiskUsageRangePerJob((java.lang.Long)value);
      }
      break;

    case DOCUMENTS:
      if (value == null) {
        unsetDocuments();
      } else {
        if (value instanceof byte[]) {
          setDocuments((byte[])value);
        } else {
          setDocuments((java.nio.ByteBuffer)value);
        }
      }
      break;

    case FIELD_OF_SCIENCE:
      if (value == null) {
        unsetFieldOfScience();
      } else {
        setFieldOfScience((java.lang.String)value);
      }
      break;

    case KEYWORDS:
      if (value == null) {
        unsetKeywords();
      } else {
        setKeywords((java.lang.String)value);
      }
      break;

    case MAX_MEMORY_PER_CPU:
      if (value == null) {
        unsetMaxMemoryPerCpu();
      } else {
        setMaxMemoryPerCpu((java.lang.Long)value);
      }
      break;

    case NUMBER_OF_CPU_PER_JOB:
      if (value == null) {
        unsetNumberOfCpuPerJob();
      } else {
        setNumberOfCpuPerJob((java.lang.Long)value);
      }
      break;

    case PROJECT_DESCRIPTION:
      if (value == null) {
        unsetProjectDescription();
      } else {
        setProjectDescription((java.lang.String)value);
      }
      break;

    case PROJECT_REVIEWED_AND_FUNDED_BY:
      if (value == null) {
        unsetProjectReviewedAndFundedBy();
      } else {
        setProjectReviewedAndFundedBy((java.lang.String)value);
      }
      break;

    case REQUESTED_DATE:
      if (value == null) {
        unsetRequestedDate();
      } else {
        setRequestedDate((java.lang.Long)value);
      }
      break;

    case SERVICE_UNITS:
      if (value == null) {
        unsetServiceUnits();
      } else {
        setServiceUnits((java.lang.Long)value);
      }
      break;

    case SPECIFIC_RESOURCE_SELECTION:
      if (value == null) {
        unsetSpecificResourceSelection();
      } else {
        setSpecificResourceSelection((java.lang.String)value);
      }
      break;

    case TITLE:
      if (value == null) {
        unsetTitle();
      } else {
        setTitle((java.lang.String)value);
      }
      break;

    case TYPE_OF_ALLOCATION:
      if (value == null) {
        unsetTypeOfAllocation();
      } else {
        setTypeOfAllocation((java.lang.String)value);
      }
      break;

    case TYPICAL_SU_PER_JOB:
      if (value == null) {
        unsetTypicalSuPerJob();
      } else {
        setTypicalSuPerJob((java.lang.Long)value);
      }
      break;

    case AWARD_ALLOCATION:
      if (value == null) {
        unsetAwardAllocation();
      } else {
        setAwardAllocation((java.lang.Long)value);
      }
      break;

    case START_DATE:
      if (value == null) {
        unsetStartDate();
      } else {
        setStartDate((java.lang.Long)value);
      }
      break;

    case END_DATE:
      if (value == null) {
        unsetEndDate();
      } else {
        setEndDate((java.lang.Long)value);
      }
      break;

    case STATUS:
      if (value == null) {
        unsetStatus();
      } else {
        setStatus((java.lang.String)value);
      }
      break;

    case IS_PRIMARY_OWNER:
      if (value == null) {
        unsetIsPrimaryOwner();
      } else {
        setIsPrimaryOwner((java.lang.Boolean)value);
      }
      break;

    }
  }

  public java.lang.Object getFieldValue(_Fields field) {
    switch (field) {
    case ID:
      return getId();

    case APPLICATIONS_TO_BE_USED:
      return getApplicationsToBeUsed();

    case DISK_USAGE_RANGE_PER_JOB:
      return getDiskUsageRangePerJob();

    case DOCUMENTS:
      return getDocuments();

    case FIELD_OF_SCIENCE:
      return getFieldOfScience();

    case KEYWORDS:
      return getKeywords();

    case MAX_MEMORY_PER_CPU:
      return getMaxMemoryPerCpu();

    case NUMBER_OF_CPU_PER_JOB:
      return getNumberOfCpuPerJob();

    case PROJECT_DESCRIPTION:
      return getProjectDescription();

    case PROJECT_REVIEWED_AND_FUNDED_BY:
      return getProjectReviewedAndFundedBy();

    case REQUESTED_DATE:
      return getRequestedDate();

    case SERVICE_UNITS:
      return getServiceUnits();

    case SPECIFIC_RESOURCE_SELECTION:
      return getSpecificResourceSelection();

    case TITLE:
      return getTitle();

    case TYPE_OF_ALLOCATION:
      return getTypeOfAllocation();

    case TYPICAL_SU_PER_JOB:
      return getTypicalSuPerJob();

    case AWARD_ALLOCATION:
      return getAwardAllocation();

    case START_DATE:
      return getStartDate();

    case END_DATE:
      return getEndDate();

    case STATUS:
      return getStatus();

    case IS_PRIMARY_OWNER:
      return isIsPrimaryOwner();

    }
    throw new java.lang.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 java.lang.IllegalArgumentException();
    }

    switch (field) {
    case ID:
      return isSetId();
    case APPLICATIONS_TO_BE_USED:
      return isSetApplicationsToBeUsed();
    case DISK_USAGE_RANGE_PER_JOB:
      return isSetDiskUsageRangePerJob();
    case DOCUMENTS:
      return isSetDocuments();
    case FIELD_OF_SCIENCE:
      return isSetFieldOfScience();
    case KEYWORDS:
      return isSetKeywords();
    case MAX_MEMORY_PER_CPU:
      return isSetMaxMemoryPerCpu();
    case NUMBER_OF_CPU_PER_JOB:
      return isSetNumberOfCpuPerJob();
    case PROJECT_DESCRIPTION:
      return isSetProjectDescription();
    case PROJECT_REVIEWED_AND_FUNDED_BY:
      return isSetProjectReviewedAndFundedBy();
    case REQUESTED_DATE:
      return isSetRequestedDate();
    case SERVICE_UNITS:
      return isSetServiceUnits();
    case SPECIFIC_RESOURCE_SELECTION:
      return isSetSpecificResourceSelection();
    case TITLE:
      return isSetTitle();
    case TYPE_OF_ALLOCATION:
      return isSetTypeOfAllocation();
    case TYPICAL_SU_PER_JOB:
      return isSetTypicalSuPerJob();
    case AWARD_ALLOCATION:
      return isSetAwardAllocation();
    case START_DATE:
      return isSetStartDate();
    case END_DATE:
      return isSetEndDate();
    case STATUS:
      return isSetStatus();
    case IS_PRIMARY_OWNER:
      return isSetIsPrimaryOwner();
    }
    throw new java.lang.IllegalStateException();
  }

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

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

    boolean this_present_id = true && this.isSetId();
    boolean that_present_id = true && that.isSetId();
    if (this_present_id || that_present_id) {
      if (!(this_present_id && that_present_id))
        return false;
      if (!this.id.equals(that.id))
        return false;
    }

    boolean this_present_applicationsToBeUsed = true && this.isSetApplicationsToBeUsed();
    boolean that_present_applicationsToBeUsed = true && that.isSetApplicationsToBeUsed();
    if (this_present_applicationsToBeUsed || that_present_applicationsToBeUsed) {
      if (!(this_present_applicationsToBeUsed && that_present_applicationsToBeUsed))
        return false;
      if (!this.applicationsToBeUsed.equals(that.applicationsToBeUsed))
        return false;
    }

    boolean this_present_diskUsageRangePerJob = true && this.isSetDiskUsageRangePerJob();
    boolean that_present_diskUsageRangePerJob = true && that.isSetDiskUsageRangePerJob();
    if (this_present_diskUsageRangePerJob || that_present_diskUsageRangePerJob) {
      if (!(this_present_diskUsageRangePerJob && that_present_diskUsageRangePerJob))
        return false;
      if (this.diskUsageRangePerJob != that.diskUsageRangePerJob)
        return false;
    }

    boolean this_present_documents = true && this.isSetDocuments();
    boolean that_present_documents = true && that.isSetDocuments();
    if (this_present_documents || that_present_documents) {
      if (!(this_present_documents && that_present_documents))
        return false;
      if (!this.documents.equals(that.documents))
        return false;
    }

    boolean this_present_fieldOfScience = true && this.isSetFieldOfScience();
    boolean that_present_fieldOfScience = true && that.isSetFieldOfScience();
    if (this_present_fieldOfScience || that_present_fieldOfScience) {
      if (!(this_present_fieldOfScience && that_present_fieldOfScience))
        return false;
      if (!this.fieldOfScience.equals(that.fieldOfScience))
        return false;
    }

    boolean this_present_keywords = true && this.isSetKeywords();
    boolean that_present_keywords = true && that.isSetKeywords();
    if (this_present_keywords || that_present_keywords) {
      if (!(this_present_keywords && that_present_keywords))
        return false;
      if (!this.keywords.equals(that.keywords))
        return false;
    }

    boolean this_present_maxMemoryPerCpu = true && this.isSetMaxMemoryPerCpu();
    boolean that_present_maxMemoryPerCpu = true && that.isSetMaxMemoryPerCpu();
    if (this_present_maxMemoryPerCpu || that_present_maxMemoryPerCpu) {
      if (!(this_present_maxMemoryPerCpu && that_present_maxMemoryPerCpu))
        return false;
      if (this.maxMemoryPerCpu != that.maxMemoryPerCpu)
        return false;
    }

    boolean this_present_numberOfCpuPerJob = true && this.isSetNumberOfCpuPerJob();
    boolean that_present_numberOfCpuPerJob = true && that.isSetNumberOfCpuPerJob();
    if (this_present_numberOfCpuPerJob || that_present_numberOfCpuPerJob) {
      if (!(this_present_numberOfCpuPerJob && that_present_numberOfCpuPerJob))
        return false;
      if (this.numberOfCpuPerJob != that.numberOfCpuPerJob)
        return false;
    }

    boolean this_present_projectDescription = true && this.isSetProjectDescription();
    boolean that_present_projectDescription = true && that.isSetProjectDescription();
    if (this_present_projectDescription || that_present_projectDescription) {
      if (!(this_present_projectDescription && that_present_projectDescription))
        return false;
      if (!this.projectDescription.equals(that.projectDescription))
        return false;
    }

    boolean this_present_projectReviewedAndFundedBy = true && this.isSetProjectReviewedAndFundedBy();
    boolean that_present_projectReviewedAndFundedBy = true && that.isSetProjectReviewedAndFundedBy();
    if (this_present_projectReviewedAndFundedBy || that_present_projectReviewedAndFundedBy) {
      if (!(this_present_projectReviewedAndFundedBy && that_present_projectReviewedAndFundedBy))
        return false;
      if (!this.projectReviewedAndFundedBy.equals(that.projectReviewedAndFundedBy))
        return false;
    }

    boolean this_present_requestedDate = true && this.isSetRequestedDate();
    boolean that_present_requestedDate = true && that.isSetRequestedDate();
    if (this_present_requestedDate || that_present_requestedDate) {
      if (!(this_present_requestedDate && that_present_requestedDate))
        return false;
      if (this.requestedDate != that.requestedDate)
        return false;
    }

    boolean this_present_serviceUnits = true && this.isSetServiceUnits();
    boolean that_present_serviceUnits = true && that.isSetServiceUnits();
    if (this_present_serviceUnits || that_present_serviceUnits) {
      if (!(this_present_serviceUnits && that_present_serviceUnits))
        return false;
      if (this.serviceUnits != that.serviceUnits)
        return false;
    }

    boolean this_present_specificResourceSelection = true && this.isSetSpecificResourceSelection();
    boolean that_present_specificResourceSelection = true && that.isSetSpecificResourceSelection();
    if (this_present_specificResourceSelection || that_present_specificResourceSelection) {
      if (!(this_present_specificResourceSelection && that_present_specificResourceSelection))
        return false;
      if (!this.specificResourceSelection.equals(that.specificResourceSelection))
        return false;
    }

    boolean this_present_title = true && this.isSetTitle();
    boolean that_present_title = true && that.isSetTitle();
    if (this_present_title || that_present_title) {
      if (!(this_present_title && that_present_title))
        return false;
      if (!this.title.equals(that.title))
        return false;
    }

    boolean this_present_typeOfAllocation = true && this.isSetTypeOfAllocation();
    boolean that_present_typeOfAllocation = true && that.isSetTypeOfAllocation();
    if (this_present_typeOfAllocation || that_present_typeOfAllocation) {
      if (!(this_present_typeOfAllocation && that_present_typeOfAllocation))
        return false;
      if (!this.typeOfAllocation.equals(that.typeOfAllocation))
        return false;
    }

    boolean this_present_typicalSuPerJob = true && this.isSetTypicalSuPerJob();
    boolean that_present_typicalSuPerJob = true && that.isSetTypicalSuPerJob();
    if (this_present_typicalSuPerJob || that_present_typicalSuPerJob) {
      if (!(this_present_typicalSuPerJob && that_present_typicalSuPerJob))
        return false;
      if (this.typicalSuPerJob != that.typicalSuPerJob)
        return false;
    }

    boolean this_present_awardAllocation = true && this.isSetAwardAllocation();
    boolean that_present_awardAllocation = true && that.isSetAwardAllocation();
    if (this_present_awardAllocation || that_present_awardAllocation) {
      if (!(this_present_awardAllocation && that_present_awardAllocation))
        return false;
      if (this.awardAllocation != that.awardAllocation)
        return false;
    }

    boolean this_present_startDate = true && this.isSetStartDate();
    boolean that_present_startDate = true && that.isSetStartDate();
    if (this_present_startDate || that_present_startDate) {
      if (!(this_present_startDate && that_present_startDate))
        return false;
      if (this.startDate != that.startDate)
        return false;
    }

    boolean this_present_endDate = true && this.isSetEndDate();
    boolean that_present_endDate = true && that.isSetEndDate();
    if (this_present_endDate || that_present_endDate) {
      if (!(this_present_endDate && that_present_endDate))
        return false;
      if (this.endDate != that.endDate)
        return false;
    }

    boolean this_present_status = true && this.isSetStatus();
    boolean that_present_status = true && that.isSetStatus();
    if (this_present_status || that_present_status) {
      if (!(this_present_status && that_present_status))
        return false;
      if (!this.status.equals(that.status))
        return false;
    }

    boolean this_present_isPrimaryOwner = true && this.isSetIsPrimaryOwner();
    boolean that_present_isPrimaryOwner = true && that.isSetIsPrimaryOwner();
    if (this_present_isPrimaryOwner || that_present_isPrimaryOwner) {
      if (!(this_present_isPrimaryOwner && that_present_isPrimaryOwner))
        return false;
      if (this.isPrimaryOwner != that.isPrimaryOwner)
        return false;
    }

    return true;
  }

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

    hashCode = hashCode * 8191 + ((isSetId()) ? 131071 : 524287);
    if (isSetId())
      hashCode = hashCode * 8191 + id.hashCode();

    hashCode = hashCode * 8191 + ((isSetApplicationsToBeUsed()) ? 131071 : 524287);
    if (isSetApplicationsToBeUsed())
      hashCode = hashCode * 8191 + applicationsToBeUsed.hashCode();

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

    hashCode = hashCode * 8191 + ((isSetDocuments()) ? 131071 : 524287);
    if (isSetDocuments())
      hashCode = hashCode * 8191 + documents.hashCode();

    hashCode = hashCode * 8191 + ((isSetFieldOfScience()) ? 131071 : 524287);
    if (isSetFieldOfScience())
      hashCode = hashCode * 8191 + fieldOfScience.hashCode();

    hashCode = hashCode * 8191 + ((isSetKeywords()) ? 131071 : 524287);
    if (isSetKeywords())
      hashCode = hashCode * 8191 + keywords.hashCode();

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

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

    hashCode = hashCode * 8191 + ((isSetProjectDescription()) ? 131071 : 524287);
    if (isSetProjectDescription())
      hashCode = hashCode * 8191 + projectDescription.hashCode();

    hashCode = hashCode * 8191 + ((isSetProjectReviewedAndFundedBy()) ? 131071 : 524287);
    if (isSetProjectReviewedAndFundedBy())
      hashCode = hashCode * 8191 + projectReviewedAndFundedBy.hashCode();

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

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

    hashCode = hashCode * 8191 + ((isSetSpecificResourceSelection()) ? 131071 : 524287);
    if (isSetSpecificResourceSelection())
      hashCode = hashCode * 8191 + specificResourceSelection.hashCode();

    hashCode = hashCode * 8191 + ((isSetTitle()) ? 131071 : 524287);
    if (isSetTitle())
      hashCode = hashCode * 8191 + title.hashCode();

    hashCode = hashCode * 8191 + ((isSetTypeOfAllocation()) ? 131071 : 524287);
    if (isSetTypeOfAllocation())
      hashCode = hashCode * 8191 + typeOfAllocation.hashCode();

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

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

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

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

    hashCode = hashCode * 8191 + ((isSetStatus()) ? 131071 : 524287);
    if (isSetStatus())
      hashCode = hashCode * 8191 + status.hashCode();

    hashCode = hashCode * 8191 + ((isSetIsPrimaryOwner()) ? 131071 : 524287);
    if (isSetIsPrimaryOwner())
      hashCode = hashCode * 8191 + ((isPrimaryOwner) ? 131071 : 524287);

    return hashCode;
  }

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

    int lastComparison = 0;

    lastComparison = java.lang.Boolean.valueOf(isSetId()).compareTo(other.isSetId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.id, other.id);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetApplicationsToBeUsed()).compareTo(other.isSetApplicationsToBeUsed());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetApplicationsToBeUsed()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.applicationsToBeUsed, other.applicationsToBeUsed);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetDiskUsageRangePerJob()).compareTo(other.isSetDiskUsageRangePerJob());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetDiskUsageRangePerJob()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.diskUsageRangePerJob, other.diskUsageRangePerJob);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetDocuments()).compareTo(other.isSetDocuments());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetDocuments()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.documents, other.documents);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetFieldOfScience()).compareTo(other.isSetFieldOfScience());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetFieldOfScience()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.fieldOfScience, other.fieldOfScience);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetKeywords()).compareTo(other.isSetKeywords());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetKeywords()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.keywords, other.keywords);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetMaxMemoryPerCpu()).compareTo(other.isSetMaxMemoryPerCpu());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetMaxMemoryPerCpu()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.maxMemoryPerCpu, other.maxMemoryPerCpu);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetNumberOfCpuPerJob()).compareTo(other.isSetNumberOfCpuPerJob());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetNumberOfCpuPerJob()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.numberOfCpuPerJob, other.numberOfCpuPerJob);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetProjectDescription()).compareTo(other.isSetProjectDescription());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetProjectDescription()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.projectDescription, other.projectDescription);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetProjectReviewedAndFundedBy()).compareTo(other.isSetProjectReviewedAndFundedBy());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetProjectReviewedAndFundedBy()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.projectReviewedAndFundedBy, other.projectReviewedAndFundedBy);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetRequestedDate()).compareTo(other.isSetRequestedDate());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetRequestedDate()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.requestedDate, other.requestedDate);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetServiceUnits()).compareTo(other.isSetServiceUnits());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetServiceUnits()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.serviceUnits, other.serviceUnits);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetSpecificResourceSelection()).compareTo(other.isSetSpecificResourceSelection());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetSpecificResourceSelection()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.specificResourceSelection, other.specificResourceSelection);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetTitle()).compareTo(other.isSetTitle());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetTitle()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.title, other.title);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetTypeOfAllocation()).compareTo(other.isSetTypeOfAllocation());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetTypeOfAllocation()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.typeOfAllocation, other.typeOfAllocation);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetTypicalSuPerJob()).compareTo(other.isSetTypicalSuPerJob());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetTypicalSuPerJob()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.typicalSuPerJob, other.typicalSuPerJob);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetAwardAllocation()).compareTo(other.isSetAwardAllocation());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetAwardAllocation()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.awardAllocation, other.awardAllocation);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetStartDate()).compareTo(other.isSetStartDate());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetStartDate()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.startDate, other.startDate);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetEndDate()).compareTo(other.isSetEndDate());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetEndDate()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.endDate, other.endDate);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetStatus()).compareTo(other.isSetStatus());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetStatus()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.status, other.status);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetIsPrimaryOwner()).compareTo(other.isSetIsPrimaryOwner());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetIsPrimaryOwner()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.isPrimaryOwner, other.isPrimaryOwner);
      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 {
    scheme(iprot).read(iprot, this);
  }

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

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

    if (isSetId()) {
      sb.append("id:");
      if (this.id == null) {
        sb.append("null");
      } else {
        sb.append(this.id);
      }
      first = false;
    }
    if (isSetApplicationsToBeUsed()) {
      if (!first) sb.append(", ");
      sb.append("applicationsToBeUsed:");
      if (this.applicationsToBeUsed == null) {
        sb.append("null");
      } else {
        sb.append(this.applicationsToBeUsed);
      }
      first = false;
    }
    if (isSetDiskUsageRangePerJob()) {
      if (!first) sb.append(", ");
      sb.append("diskUsageRangePerJob:");
      sb.append(this.diskUsageRangePerJob);
      first = false;
    }
    if (isSetDocuments()) {
      if (!first) sb.append(", ");
      sb.append("documents:");
      if (this.documents == null) {
        sb.append("null");
      } else {
        org.apache.thrift.TBaseHelper.toString(this.documents, sb);
      }
      first = false;
    }
    if (isSetFieldOfScience()) {
      if (!first) sb.append(", ");
      sb.append("fieldOfScience:");
      if (this.fieldOfScience == null) {
        sb.append("null");
      } else {
        sb.append(this.fieldOfScience);
      }
      first = false;
    }
    if (isSetKeywords()) {
      if (!first) sb.append(", ");
      sb.append("keywords:");
      if (this.keywords == null) {
        sb.append("null");
      } else {
        sb.append(this.keywords);
      }
      first = false;
    }
    if (isSetMaxMemoryPerCpu()) {
      if (!first) sb.append(", ");
      sb.append("maxMemoryPerCpu:");
      sb.append(this.maxMemoryPerCpu);
      first = false;
    }
    if (isSetNumberOfCpuPerJob()) {
      if (!first) sb.append(", ");
      sb.append("numberOfCpuPerJob:");
      sb.append(this.numberOfCpuPerJob);
      first = false;
    }
    if (isSetProjectDescription()) {
      if (!first) sb.append(", ");
      sb.append("projectDescription:");
      if (this.projectDescription == null) {
        sb.append("null");
      } else {
        sb.append(this.projectDescription);
      }
      first = false;
    }
    if (isSetProjectReviewedAndFundedBy()) {
      if (!first) sb.append(", ");
      sb.append("projectReviewedAndFundedBy:");
      if (this.projectReviewedAndFundedBy == null) {
        sb.append("null");
      } else {
        sb.append(this.projectReviewedAndFundedBy);
      }
      first = false;
    }
    if (isSetRequestedDate()) {
      if (!first) sb.append(", ");
      sb.append("requestedDate:");
      sb.append(this.requestedDate);
      first = false;
    }
    if (isSetServiceUnits()) {
      if (!first) sb.append(", ");
      sb.append("serviceUnits:");
      sb.append(this.serviceUnits);
      first = false;
    }
    if (isSetSpecificResourceSelection()) {
      if (!first) sb.append(", ");
      sb.append("specificResourceSelection:");
      if (this.specificResourceSelection == null) {
        sb.append("null");
      } else {
        sb.append(this.specificResourceSelection);
      }
      first = false;
    }
    if (isSetTitle()) {
      if (!first) sb.append(", ");
      sb.append("title:");
      if (this.title == null) {
        sb.append("null");
      } else {
        sb.append(this.title);
      }
      first = false;
    }
    if (isSetTypeOfAllocation()) {
      if (!first) sb.append(", ");
      sb.append("typeOfAllocation:");
      if (this.typeOfAllocation == null) {
        sb.append("null");
      } else {
        sb.append(this.typeOfAllocation);
      }
      first = false;
    }
    if (isSetTypicalSuPerJob()) {
      if (!first) sb.append(", ");
      sb.append("typicalSuPerJob:");
      sb.append(this.typicalSuPerJob);
      first = false;
    }
    if (isSetAwardAllocation()) {
      if (!first) sb.append(", ");
      sb.append("awardAllocation:");
      sb.append(this.awardAllocation);
      first = false;
    }
    if (isSetStartDate()) {
      if (!first) sb.append(", ");
      sb.append("startDate:");
      sb.append(this.startDate);
      first = false;
    }
    if (isSetEndDate()) {
      if (!first) sb.append(", ");
      sb.append("endDate:");
      sb.append(this.endDate);
      first = false;
    }
    if (isSetStatus()) {
      if (!first) sb.append(", ");
      sb.append("status:");
      if (this.status == null) {
        sb.append("null");
      } else {
        sb.append(this.status);
      }
      first = false;
    }
    if (isSetIsPrimaryOwner()) {
      if (!first) sb.append(", ");
      sb.append("isPrimaryOwner:");
      sb.append(this.isPrimaryOwner);
      first = false;
    }
    sb.append(")");
    return sb.toString();
  }

  public void validate() throws org.apache.thrift.TException {
    // check for required fields
    // check for sub-struct validity
    if (id != null) {
      id.validate();
    }
  }

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

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

  private static class UserAllocationDetailStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
    public UserAllocationDetailStandardScheme getScheme() {
      return new UserAllocationDetailStandardScheme();
    }
  }

  private static class UserAllocationDetailStandardScheme extends org.apache.thrift.scheme.StandardScheme<UserAllocationDetail> {

    public void read(org.apache.thrift.protocol.TProtocol iprot, UserAllocationDetail 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: // ID
            if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {
              struct.id = new UserAllocationDetailPK();
              struct.id.read(iprot);
              struct.setIdIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 2: // APPLICATIONS_TO_BE_USED
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.applicationsToBeUsed = iprot.readString();
              struct.setApplicationsToBeUsedIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 3: // DISK_USAGE_RANGE_PER_JOB
            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
              struct.diskUsageRangePerJob = iprot.readI64();
              struct.setDiskUsageRangePerJobIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 4: // DOCUMENTS
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.documents = iprot.readBinary();
              struct.setDocumentsIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 5: // FIELD_OF_SCIENCE
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.fieldOfScience = iprot.readString();
              struct.setFieldOfScienceIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 6: // KEYWORDS
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.keywords = iprot.readString();
              struct.setKeywordsIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 7: // MAX_MEMORY_PER_CPU
            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
              struct.maxMemoryPerCpu = iprot.readI64();
              struct.setMaxMemoryPerCpuIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 8: // NUMBER_OF_CPU_PER_JOB
            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
              struct.numberOfCpuPerJob = iprot.readI64();
              struct.setNumberOfCpuPerJobIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 9: // PROJECT_DESCRIPTION
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.projectDescription = iprot.readString();
              struct.setProjectDescriptionIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 10: // PROJECT_REVIEWED_AND_FUNDED_BY
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.projectReviewedAndFundedBy = iprot.readString();
              struct.setProjectReviewedAndFundedByIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 11: // REQUESTED_DATE
            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
              struct.requestedDate = iprot.readI64();
              struct.setRequestedDateIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 12: // SERVICE_UNITS
            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
              struct.serviceUnits = iprot.readI64();
              struct.setServiceUnitsIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 13: // SPECIFIC_RESOURCE_SELECTION
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.specificResourceSelection = iprot.readString();
              struct.setSpecificResourceSelectionIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 14: // TITLE
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.title = iprot.readString();
              struct.setTitleIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 15: // TYPE_OF_ALLOCATION
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.typeOfAllocation = iprot.readString();
              struct.setTypeOfAllocationIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 16: // TYPICAL_SU_PER_JOB
            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
              struct.typicalSuPerJob = iprot.readI64();
              struct.setTypicalSuPerJobIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 17: // AWARD_ALLOCATION
            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
              struct.awardAllocation = iprot.readI64();
              struct.setAwardAllocationIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 18: // START_DATE
            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
              struct.startDate = iprot.readI64();
              struct.setStartDateIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 19: // END_DATE
            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
              struct.endDate = iprot.readI64();
              struct.setEndDateIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 20: // STATUS
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.status = iprot.readString();
              struct.setStatusIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 21: // IS_PRIMARY_OWNER
            if (schemeField.type == org.apache.thrift.protocol.TType.BOOL) {
              struct.isPrimaryOwner = iprot.readBool();
              struct.setIsPrimaryOwnerIsSet(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();

      // check for required fields of primitive type, which can't be checked in the validate method
      struct.validate();
    }

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

      oprot.writeStructBegin(STRUCT_DESC);
      if (struct.id != null) {
        if (struct.isSetId()) {
          oprot.writeFieldBegin(ID_FIELD_DESC);
          struct.id.write(oprot);
          oprot.writeFieldEnd();
        }
      }
      if (struct.applicationsToBeUsed != null) {
        if (struct.isSetApplicationsToBeUsed()) {
          oprot.writeFieldBegin(APPLICATIONS_TO_BE_USED_FIELD_DESC);
          oprot.writeString(struct.applicationsToBeUsed);
          oprot.writeFieldEnd();
        }
      }
      if (struct.isSetDiskUsageRangePerJob()) {
        oprot.writeFieldBegin(DISK_USAGE_RANGE_PER_JOB_FIELD_DESC);
        oprot.writeI64(struct.diskUsageRangePerJob);
        oprot.writeFieldEnd();
      }
      if (struct.documents != null) {
        if (struct.isSetDocuments()) {
          oprot.writeFieldBegin(DOCUMENTS_FIELD_DESC);
          oprot.writeBinary(struct.documents);
          oprot.writeFieldEnd();
        }
      }
      if (struct.fieldOfScience != null) {
        if (struct.isSetFieldOfScience()) {
          oprot.writeFieldBegin(FIELD_OF_SCIENCE_FIELD_DESC);
          oprot.writeString(struct.fieldOfScience);
          oprot.writeFieldEnd();
        }
      }
      if (struct.keywords != null) {
        if (struct.isSetKeywords()) {
          oprot.writeFieldBegin(KEYWORDS_FIELD_DESC);
          oprot.writeString(struct.keywords);
          oprot.writeFieldEnd();
        }
      }
      if (struct.isSetMaxMemoryPerCpu()) {
        oprot.writeFieldBegin(MAX_MEMORY_PER_CPU_FIELD_DESC);
        oprot.writeI64(struct.maxMemoryPerCpu);
        oprot.writeFieldEnd();
      }
      if (struct.isSetNumberOfCpuPerJob()) {
        oprot.writeFieldBegin(NUMBER_OF_CPU_PER_JOB_FIELD_DESC);
        oprot.writeI64(struct.numberOfCpuPerJob);
        oprot.writeFieldEnd();
      }
      if (struct.projectDescription != null) {
        if (struct.isSetProjectDescription()) {
          oprot.writeFieldBegin(PROJECT_DESCRIPTION_FIELD_DESC);
          oprot.writeString(struct.projectDescription);
          oprot.writeFieldEnd();
        }
      }
      if (struct.projectReviewedAndFundedBy != null) {
        if (struct.isSetProjectReviewedAndFundedBy()) {
          oprot.writeFieldBegin(PROJECT_REVIEWED_AND_FUNDED_BY_FIELD_DESC);
          oprot.writeString(struct.projectReviewedAndFundedBy);
          oprot.writeFieldEnd();
        }
      }
      if (struct.isSetRequestedDate()) {
        oprot.writeFieldBegin(REQUESTED_DATE_FIELD_DESC);
        oprot.writeI64(struct.requestedDate);
        oprot.writeFieldEnd();
      }
      if (struct.isSetServiceUnits()) {
        oprot.writeFieldBegin(SERVICE_UNITS_FIELD_DESC);
        oprot.writeI64(struct.serviceUnits);
        oprot.writeFieldEnd();
      }
      if (struct.specificResourceSelection != null) {
        if (struct.isSetSpecificResourceSelection()) {
          oprot.writeFieldBegin(SPECIFIC_RESOURCE_SELECTION_FIELD_DESC);
          oprot.writeString(struct.specificResourceSelection);
          oprot.writeFieldEnd();
        }
      }
      if (struct.title != null) {
        if (struct.isSetTitle()) {
          oprot.writeFieldBegin(TITLE_FIELD_DESC);
          oprot.writeString(struct.title);
          oprot.writeFieldEnd();
        }
      }
      if (struct.typeOfAllocation != null) {
        if (struct.isSetTypeOfAllocation()) {
          oprot.writeFieldBegin(TYPE_OF_ALLOCATION_FIELD_DESC);
          oprot.writeString(struct.typeOfAllocation);
          oprot.writeFieldEnd();
        }
      }
      if (struct.isSetTypicalSuPerJob()) {
        oprot.writeFieldBegin(TYPICAL_SU_PER_JOB_FIELD_DESC);
        oprot.writeI64(struct.typicalSuPerJob);
        oprot.writeFieldEnd();
      }
      if (struct.isSetAwardAllocation()) {
        oprot.writeFieldBegin(AWARD_ALLOCATION_FIELD_DESC);
        oprot.writeI64(struct.awardAllocation);
        oprot.writeFieldEnd();
      }
      if (struct.isSetStartDate()) {
        oprot.writeFieldBegin(START_DATE_FIELD_DESC);
        oprot.writeI64(struct.startDate);
        oprot.writeFieldEnd();
      }
      if (struct.isSetEndDate()) {
        oprot.writeFieldBegin(END_DATE_FIELD_DESC);
        oprot.writeI64(struct.endDate);
        oprot.writeFieldEnd();
      }
      if (struct.status != null) {
        if (struct.isSetStatus()) {
          oprot.writeFieldBegin(STATUS_FIELD_DESC);
          oprot.writeString(struct.status);
          oprot.writeFieldEnd();
        }
      }
      if (struct.isSetIsPrimaryOwner()) {
        oprot.writeFieldBegin(IS_PRIMARY_OWNER_FIELD_DESC);
        oprot.writeBool(struct.isPrimaryOwner);
        oprot.writeFieldEnd();
      }
      oprot.writeFieldStop();
      oprot.writeStructEnd();
    }

  }

  private static class UserAllocationDetailTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
    public UserAllocationDetailTupleScheme getScheme() {
      return new UserAllocationDetailTupleScheme();
    }
  }

  private static class UserAllocationDetailTupleScheme extends org.apache.thrift.scheme.TupleScheme<UserAllocationDetail> {

    @Override
    public void write(org.apache.thrift.protocol.TProtocol prot, UserAllocationDetail struct) throws org.apache.thrift.TException {
      org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
      java.util.BitSet optionals = new java.util.BitSet();
      if (struct.isSetId()) {
        optionals.set(0);
      }
      if (struct.isSetApplicationsToBeUsed()) {
        optionals.set(1);
      }
      if (struct.isSetDiskUsageRangePerJob()) {
        optionals.set(2);
      }
      if (struct.isSetDocuments()) {
        optionals.set(3);
      }
      if (struct.isSetFieldOfScience()) {
        optionals.set(4);
      }
      if (struct.isSetKeywords()) {
        optionals.set(5);
      }
      if (struct.isSetMaxMemoryPerCpu()) {
        optionals.set(6);
      }
      if (struct.isSetNumberOfCpuPerJob()) {
        optionals.set(7);
      }
      if (struct.isSetProjectDescription()) {
        optionals.set(8);
      }
      if (struct.isSetProjectReviewedAndFundedBy()) {
        optionals.set(9);
      }
      if (struct.isSetRequestedDate()) {
        optionals.set(10);
      }
      if (struct.isSetServiceUnits()) {
        optionals.set(11);
      }
      if (struct.isSetSpecificResourceSelection()) {
        optionals.set(12);
      }
      if (struct.isSetTitle()) {
        optionals.set(13);
      }
      if (struct.isSetTypeOfAllocation()) {
        optionals.set(14);
      }
      if (struct.isSetTypicalSuPerJob()) {
        optionals.set(15);
      }
      if (struct.isSetAwardAllocation()) {
        optionals.set(16);
      }
      if (struct.isSetStartDate()) {
        optionals.set(17);
      }
      if (struct.isSetEndDate()) {
        optionals.set(18);
      }
      if (struct.isSetStatus()) {
        optionals.set(19);
      }
      if (struct.isSetIsPrimaryOwner()) {
        optionals.set(20);
      }
      oprot.writeBitSet(optionals, 21);
      if (struct.isSetId()) {
        struct.id.write(oprot);
      }
      if (struct.isSetApplicationsToBeUsed()) {
        oprot.writeString(struct.applicationsToBeUsed);
      }
      if (struct.isSetDiskUsageRangePerJob()) {
        oprot.writeI64(struct.diskUsageRangePerJob);
      }
      if (struct.isSetDocuments()) {
        oprot.writeBinary(struct.documents);
      }
      if (struct.isSetFieldOfScience()) {
        oprot.writeString(struct.fieldOfScience);
      }
      if (struct.isSetKeywords()) {
        oprot.writeString(struct.keywords);
      }
      if (struct.isSetMaxMemoryPerCpu()) {
        oprot.writeI64(struct.maxMemoryPerCpu);
      }
      if (struct.isSetNumberOfCpuPerJob()) {
        oprot.writeI64(struct.numberOfCpuPerJob);
      }
      if (struct.isSetProjectDescription()) {
        oprot.writeString(struct.projectDescription);
      }
      if (struct.isSetProjectReviewedAndFundedBy()) {
        oprot.writeString(struct.projectReviewedAndFundedBy);
      }
      if (struct.isSetRequestedDate()) {
        oprot.writeI64(struct.requestedDate);
      }
      if (struct.isSetServiceUnits()) {
        oprot.writeI64(struct.serviceUnits);
      }
      if (struct.isSetSpecificResourceSelection()) {
        oprot.writeString(struct.specificResourceSelection);
      }
      if (struct.isSetTitle()) {
        oprot.writeString(struct.title);
      }
      if (struct.isSetTypeOfAllocation()) {
        oprot.writeString(struct.typeOfAllocation);
      }
      if (struct.isSetTypicalSuPerJob()) {
        oprot.writeI64(struct.typicalSuPerJob);
      }
      if (struct.isSetAwardAllocation()) {
        oprot.writeI64(struct.awardAllocation);
      }
      if (struct.isSetStartDate()) {
        oprot.writeI64(struct.startDate);
      }
      if (struct.isSetEndDate()) {
        oprot.writeI64(struct.endDate);
      }
      if (struct.isSetStatus()) {
        oprot.writeString(struct.status);
      }
      if (struct.isSetIsPrimaryOwner()) {
        oprot.writeBool(struct.isPrimaryOwner);
      }
    }

    @Override
    public void read(org.apache.thrift.protocol.TProtocol prot, UserAllocationDetail struct) throws org.apache.thrift.TException {
      org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
      java.util.BitSet incoming = iprot.readBitSet(21);
      if (incoming.get(0)) {
        struct.id = new UserAllocationDetailPK();
        struct.id.read(iprot);
        struct.setIdIsSet(true);
      }
      if (incoming.get(1)) {
        struct.applicationsToBeUsed = iprot.readString();
        struct.setApplicationsToBeUsedIsSet(true);
      }
      if (incoming.get(2)) {
        struct.diskUsageRangePerJob = iprot.readI64();
        struct.setDiskUsageRangePerJobIsSet(true);
      }
      if (incoming.get(3)) {
        struct.documents = iprot.readBinary();
        struct.setDocumentsIsSet(true);
      }
      if (incoming.get(4)) {
        struct.fieldOfScience = iprot.readString();
        struct.setFieldOfScienceIsSet(true);
      }
      if (incoming.get(5)) {
        struct.keywords = iprot.readString();
        struct.setKeywordsIsSet(true);
      }
      if (incoming.get(6)) {
        struct.maxMemoryPerCpu = iprot.readI64();
        struct.setMaxMemoryPerCpuIsSet(true);
      }
      if (incoming.get(7)) {
        struct.numberOfCpuPerJob = iprot.readI64();
        struct.setNumberOfCpuPerJobIsSet(true);
      }
      if (incoming.get(8)) {
        struct.projectDescription = iprot.readString();
        struct.setProjectDescriptionIsSet(true);
      }
      if (incoming.get(9)) {
        struct.projectReviewedAndFundedBy = iprot.readString();
        struct.setProjectReviewedAndFundedByIsSet(true);
      }
      if (incoming.get(10)) {
        struct.requestedDate = iprot.readI64();
        struct.setRequestedDateIsSet(true);
      }
      if (incoming.get(11)) {
        struct.serviceUnits = iprot.readI64();
        struct.setServiceUnitsIsSet(true);
      }
      if (incoming.get(12)) {
        struct.specificResourceSelection = iprot.readString();
        struct.setSpecificResourceSelectionIsSet(true);
      }
      if (incoming.get(13)) {
        struct.title = iprot.readString();
        struct.setTitleIsSet(true);
      }
      if (incoming.get(14)) {
        struct.typeOfAllocation = iprot.readString();
        struct.setTypeOfAllocationIsSet(true);
      }
      if (incoming.get(15)) {
        struct.typicalSuPerJob = iprot.readI64();
        struct.setTypicalSuPerJobIsSet(true);
      }
      if (incoming.get(16)) {
        struct.awardAllocation = iprot.readI64();
        struct.setAwardAllocationIsSet(true);
      }
      if (incoming.get(17)) {
        struct.startDate = iprot.readI64();
        struct.setStartDateIsSet(true);
      }
      if (incoming.get(18)) {
        struct.endDate = iprot.readI64();
        struct.setEndDateIsSet(true);
      }
      if (incoming.get(19)) {
        struct.status = iprot.readString();
        struct.setStatusIsSet(true);
      }
      if (incoming.get(20)) {
        struct.isPrimaryOwner = iprot.readBool();
        struct.setIsPrimaryOwnerIsSet(true);
      }
    }
  }

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

