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

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

@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"})
/**
 * A structure holding the cutomized admin dashboard information.
 * 
 * 
 */
@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.10.0)")
public class CustomDashboard implements org.apache.thrift.TBase<CustomDashboard, CustomDashboard._Fields>, java.io.Serializable, Cloneable, Comparable<CustomDashboard> {
  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("CustomDashboard");

  private static final org.apache.thrift.protocol.TField AIRAVATA_INTERNAL_USER_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("airavataInternalUserId", org.apache.thrift.protocol.TType.STRING, (short)1);
  private static final org.apache.thrift.protocol.TField EXPERIMENT_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("experimentId", org.apache.thrift.protocol.TType.STRING, (short)2);
  private static final org.apache.thrift.protocol.TField NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("name", org.apache.thrift.protocol.TType.STRING, (short)3);
  private static final org.apache.thrift.protocol.TField DESCRIPTION_FIELD_DESC = new org.apache.thrift.protocol.TField("description", org.apache.thrift.protocol.TType.STRING, (short)4);
  private static final org.apache.thrift.protocol.TField PROJECT_FIELD_DESC = new org.apache.thrift.protocol.TField("project", org.apache.thrift.protocol.TType.STRING, (short)5);
  private static final org.apache.thrift.protocol.TField OWNER_FIELD_DESC = new org.apache.thrift.protocol.TField("owner", org.apache.thrift.protocol.TType.STRING, (short)6);
  private static final org.apache.thrift.protocol.TField APPLICATION_FIELD_DESC = new org.apache.thrift.protocol.TField("application", org.apache.thrift.protocol.TType.STRING, (short)7);
  private static final org.apache.thrift.protocol.TField COMPUTE_RESOURCE_FIELD_DESC = new org.apache.thrift.protocol.TField("computeResource", org.apache.thrift.protocol.TType.STRING, (short)8);
  private static final org.apache.thrift.protocol.TField JOB_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("jobName", org.apache.thrift.protocol.TType.STRING, (short)9);
  private static final org.apache.thrift.protocol.TField JOB_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("jobId", org.apache.thrift.protocol.TType.STRING, (short)10);
  private static final org.apache.thrift.protocol.TField JOB_STATUS_FIELD_DESC = new org.apache.thrift.protocol.TField("jobStatus", org.apache.thrift.protocol.TType.STRING, (short)11);
  private static final org.apache.thrift.protocol.TField JOB_CREATION_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("jobCreationTime", org.apache.thrift.protocol.TType.STRING, (short)12);
  private static final org.apache.thrift.protocol.TField NOTIFICATIONS_TO_FIELD_DESC = new org.apache.thrift.protocol.TField("notificationsTo", org.apache.thrift.protocol.TType.STRING, (short)13);
  private static final org.apache.thrift.protocol.TField WORKING_DIR_FIELD_DESC = new org.apache.thrift.protocol.TField("workingDir", org.apache.thrift.protocol.TType.STRING, (short)14);
  private static final org.apache.thrift.protocol.TField JOB_DESCRIPTION_FIELD_DESC = new org.apache.thrift.protocol.TField("jobDescription", org.apache.thrift.protocol.TType.STRING, (short)15);
  private static final org.apache.thrift.protocol.TField CREATION_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("creationTime", org.apache.thrift.protocol.TType.STRING, (short)16);
  private static final org.apache.thrift.protocol.TField LAST_MODIFIED_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("lastModifiedTime", org.apache.thrift.protocol.TType.STRING, (short)17);
  private static final org.apache.thrift.protocol.TField WALL_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("wallTime", org.apache.thrift.protocol.TType.STRING, (short)18);
  private static final org.apache.thrift.protocol.TField CPU_COUNT_FIELD_DESC = new org.apache.thrift.protocol.TField("cpuCount", org.apache.thrift.protocol.TType.STRING, (short)19);
  private static final org.apache.thrift.protocol.TField NODE_COUNT_FIELD_DESC = new org.apache.thrift.protocol.TField("nodeCount", org.apache.thrift.protocol.TType.STRING, (short)20);
  private static final org.apache.thrift.protocol.TField QUEUE_FIELD_DESC = new org.apache.thrift.protocol.TField("queue", org.apache.thrift.protocol.TType.STRING, (short)21);
  private static final org.apache.thrift.protocol.TField INPUTS_FIELD_DESC = new org.apache.thrift.protocol.TField("inputs", org.apache.thrift.protocol.TType.STRING, (short)22);
  private static final org.apache.thrift.protocol.TField OUTPUTS_FIELD_DESC = new org.apache.thrift.protocol.TField("outputs", org.apache.thrift.protocol.TType.STRING, (short)23);
  private static final org.apache.thrift.protocol.TField STORAGE_DIR_FIELD_DESC = new org.apache.thrift.protocol.TField("storageDir", org.apache.thrift.protocol.TType.STRING, (short)24);
  private static final org.apache.thrift.protocol.TField ERRORS_FIELD_DESC = new org.apache.thrift.protocol.TField("errors", org.apache.thrift.protocol.TType.STRING, (short)25);

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

  private java.lang.String airavataInternalUserId; // required
  private java.lang.String experimentId; // optional
  private java.lang.String name; // optional
  private java.lang.String description; // optional
  private java.lang.String project; // optional
  private java.lang.String owner; // optional
  private java.lang.String application; // optional
  private java.lang.String computeResource; // optional
  private java.lang.String jobName; // optional
  private java.lang.String jobId; // optional
  private java.lang.String jobStatus; // optional
  private java.lang.String jobCreationTime; // optional
  private java.lang.String notificationsTo; // optional
  private java.lang.String workingDir; // optional
  private java.lang.String jobDescription; // optional
  private java.lang.String creationTime; // optional
  private java.lang.String lastModifiedTime; // optional
  private java.lang.String wallTime; // optional
  private java.lang.String cpuCount; // optional
  private java.lang.String nodeCount; // optional
  private java.lang.String queue; // optional
  private java.lang.String inputs; // optional
  private java.lang.String outputs; // optional
  private java.lang.String storageDir; // optional
  private java.lang.String errors; // 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 {
    AIRAVATA_INTERNAL_USER_ID((short)1, "airavataInternalUserId"),
    EXPERIMENT_ID((short)2, "experimentId"),
    NAME((short)3, "name"),
    DESCRIPTION((short)4, "description"),
    PROJECT((short)5, "project"),
    OWNER((short)6, "owner"),
    APPLICATION((short)7, "application"),
    COMPUTE_RESOURCE((short)8, "computeResource"),
    JOB_NAME((short)9, "jobName"),
    JOB_ID((short)10, "jobId"),
    JOB_STATUS((short)11, "jobStatus"),
    JOB_CREATION_TIME((short)12, "jobCreationTime"),
    NOTIFICATIONS_TO((short)13, "notificationsTo"),
    WORKING_DIR((short)14, "workingDir"),
    JOB_DESCRIPTION((short)15, "jobDescription"),
    CREATION_TIME((short)16, "creationTime"),
    LAST_MODIFIED_TIME((short)17, "lastModifiedTime"),
    WALL_TIME((short)18, "wallTime"),
    CPU_COUNT((short)19, "cpuCount"),
    NODE_COUNT((short)20, "nodeCount"),
    QUEUE((short)21, "queue"),
    INPUTS((short)22, "inputs"),
    OUTPUTS((short)23, "outputs"),
    STORAGE_DIR((short)24, "storageDir"),
    ERRORS((short)25, "errors");

    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: // AIRAVATA_INTERNAL_USER_ID
          return AIRAVATA_INTERNAL_USER_ID;
        case 2: // EXPERIMENT_ID
          return EXPERIMENT_ID;
        case 3: // NAME
          return NAME;
        case 4: // DESCRIPTION
          return DESCRIPTION;
        case 5: // PROJECT
          return PROJECT;
        case 6: // OWNER
          return OWNER;
        case 7: // APPLICATION
          return APPLICATION;
        case 8: // COMPUTE_RESOURCE
          return COMPUTE_RESOURCE;
        case 9: // JOB_NAME
          return JOB_NAME;
        case 10: // JOB_ID
          return JOB_ID;
        case 11: // JOB_STATUS
          return JOB_STATUS;
        case 12: // JOB_CREATION_TIME
          return JOB_CREATION_TIME;
        case 13: // NOTIFICATIONS_TO
          return NOTIFICATIONS_TO;
        case 14: // WORKING_DIR
          return WORKING_DIR;
        case 15: // JOB_DESCRIPTION
          return JOB_DESCRIPTION;
        case 16: // CREATION_TIME
          return CREATION_TIME;
        case 17: // LAST_MODIFIED_TIME
          return LAST_MODIFIED_TIME;
        case 18: // WALL_TIME
          return WALL_TIME;
        case 19: // CPU_COUNT
          return CPU_COUNT;
        case 20: // NODE_COUNT
          return NODE_COUNT;
        case 21: // QUEUE
          return QUEUE;
        case 22: // INPUTS
          return INPUTS;
        case 23: // OUTPUTS
          return OUTPUTS;
        case 24: // STORAGE_DIR
          return STORAGE_DIR;
        case 25: // ERRORS
          return ERRORS;
        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 _Fields optionals[] = {_Fields.EXPERIMENT_ID,_Fields.NAME,_Fields.DESCRIPTION,_Fields.PROJECT,_Fields.OWNER,_Fields.APPLICATION,_Fields.COMPUTE_RESOURCE,_Fields.JOB_NAME,_Fields.JOB_ID,_Fields.JOB_STATUS,_Fields.JOB_CREATION_TIME,_Fields.NOTIFICATIONS_TO,_Fields.WORKING_DIR,_Fields.JOB_DESCRIPTION,_Fields.CREATION_TIME,_Fields.LAST_MODIFIED_TIME,_Fields.WALL_TIME,_Fields.CPU_COUNT,_Fields.NODE_COUNT,_Fields.QUEUE,_Fields.INPUTS,_Fields.OUTPUTS,_Fields.STORAGE_DIR,_Fields.ERRORS};
  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.AIRAVATA_INTERNAL_USER_ID, new org.apache.thrift.meta_data.FieldMetaData("airavataInternalUserId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.EXPERIMENT_ID, new org.apache.thrift.meta_data.FieldMetaData("experimentId", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.NAME, new org.apache.thrift.meta_data.FieldMetaData("name", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.DESCRIPTION, new org.apache.thrift.meta_data.FieldMetaData("description", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.PROJECT, new org.apache.thrift.meta_data.FieldMetaData("project", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.OWNER, new org.apache.thrift.meta_data.FieldMetaData("owner", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.APPLICATION, new org.apache.thrift.meta_data.FieldMetaData("application", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.COMPUTE_RESOURCE, new org.apache.thrift.meta_data.FieldMetaData("computeResource", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.JOB_NAME, new org.apache.thrift.meta_data.FieldMetaData("jobName", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.JOB_ID, new org.apache.thrift.meta_data.FieldMetaData("jobId", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.JOB_STATUS, new org.apache.thrift.meta_data.FieldMetaData("jobStatus", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.JOB_CREATION_TIME, new org.apache.thrift.meta_data.FieldMetaData("jobCreationTime", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.NOTIFICATIONS_TO, new org.apache.thrift.meta_data.FieldMetaData("notificationsTo", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.WORKING_DIR, new org.apache.thrift.meta_data.FieldMetaData("workingDir", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.JOB_DESCRIPTION, new org.apache.thrift.meta_data.FieldMetaData("jobDescription", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.CREATION_TIME, new org.apache.thrift.meta_data.FieldMetaData("creationTime", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.LAST_MODIFIED_TIME, new org.apache.thrift.meta_data.FieldMetaData("lastModifiedTime", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.WALL_TIME, new org.apache.thrift.meta_data.FieldMetaData("wallTime", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.CPU_COUNT, new org.apache.thrift.meta_data.FieldMetaData("cpuCount", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.NODE_COUNT, new org.apache.thrift.meta_data.FieldMetaData("nodeCount", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.QUEUE, new org.apache.thrift.meta_data.FieldMetaData("queue", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.INPUTS, new org.apache.thrift.meta_data.FieldMetaData("inputs", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.OUTPUTS, new org.apache.thrift.meta_data.FieldMetaData("outputs", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.STORAGE_DIR, new org.apache.thrift.meta_data.FieldMetaData("storageDir", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.ERRORS, new org.apache.thrift.meta_data.FieldMetaData("errors", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(CustomDashboard.class, metaDataMap);
  }

  public CustomDashboard() {
    this.airavataInternalUserId = "DO_NOT_SET_AT_CLIENTS";

  }

  public CustomDashboard(
    java.lang.String airavataInternalUserId)
  {
    this();
    this.airavataInternalUserId = airavataInternalUserId;
  }

  /**
   * Performs a deep copy on <i>other</i>.
   */
  public CustomDashboard(CustomDashboard other) {
    if (other.isSetAiravataInternalUserId()) {
      this.airavataInternalUserId = other.airavataInternalUserId;
    }
    if (other.isSetExperimentId()) {
      this.experimentId = other.experimentId;
    }
    if (other.isSetName()) {
      this.name = other.name;
    }
    if (other.isSetDescription()) {
      this.description = other.description;
    }
    if (other.isSetProject()) {
      this.project = other.project;
    }
    if (other.isSetOwner()) {
      this.owner = other.owner;
    }
    if (other.isSetApplication()) {
      this.application = other.application;
    }
    if (other.isSetComputeResource()) {
      this.computeResource = other.computeResource;
    }
    if (other.isSetJobName()) {
      this.jobName = other.jobName;
    }
    if (other.isSetJobId()) {
      this.jobId = other.jobId;
    }
    if (other.isSetJobStatus()) {
      this.jobStatus = other.jobStatus;
    }
    if (other.isSetJobCreationTime()) {
      this.jobCreationTime = other.jobCreationTime;
    }
    if (other.isSetNotificationsTo()) {
      this.notificationsTo = other.notificationsTo;
    }
    if (other.isSetWorkingDir()) {
      this.workingDir = other.workingDir;
    }
    if (other.isSetJobDescription()) {
      this.jobDescription = other.jobDescription;
    }
    if (other.isSetCreationTime()) {
      this.creationTime = other.creationTime;
    }
    if (other.isSetLastModifiedTime()) {
      this.lastModifiedTime = other.lastModifiedTime;
    }
    if (other.isSetWallTime()) {
      this.wallTime = other.wallTime;
    }
    if (other.isSetCpuCount()) {
      this.cpuCount = other.cpuCount;
    }
    if (other.isSetNodeCount()) {
      this.nodeCount = other.nodeCount;
    }
    if (other.isSetQueue()) {
      this.queue = other.queue;
    }
    if (other.isSetInputs()) {
      this.inputs = other.inputs;
    }
    if (other.isSetOutputs()) {
      this.outputs = other.outputs;
    }
    if (other.isSetStorageDir()) {
      this.storageDir = other.storageDir;
    }
    if (other.isSetErrors()) {
      this.errors = other.errors;
    }
  }

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

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

    this.experimentId = null;
    this.name = null;
    this.description = null;
    this.project = null;
    this.owner = null;
    this.application = null;
    this.computeResource = null;
    this.jobName = null;
    this.jobId = null;
    this.jobStatus = null;
    this.jobCreationTime = null;
    this.notificationsTo = null;
    this.workingDir = null;
    this.jobDescription = null;
    this.creationTime = null;
    this.lastModifiedTime = null;
    this.wallTime = null;
    this.cpuCount = null;
    this.nodeCount = null;
    this.queue = null;
    this.inputs = null;
    this.outputs = null;
    this.storageDir = null;
    this.errors = null;
  }

  public java.lang.String getAiravataInternalUserId() {
    return this.airavataInternalUserId;
  }

  public void setAiravataInternalUserId(java.lang.String airavataInternalUserId) {
    this.airavataInternalUserId = airavataInternalUserId;
  }

  public void unsetAiravataInternalUserId() {
    this.airavataInternalUserId = null;
  }

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

  public void setAiravataInternalUserIdIsSet(boolean value) {
    if (!value) {
      this.airavataInternalUserId = null;
    }
  }

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

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

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

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

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

  public java.lang.String getName() {
    return this.name;
  }

  public void setName(java.lang.String name) {
    this.name = name;
  }

  public void unsetName() {
    this.name = null;
  }

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

  public void setNameIsSet(boolean value) {
    if (!value) {
      this.name = null;
    }
  }

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

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

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

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

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

  public java.lang.String getProject() {
    return this.project;
  }

  public void setProject(java.lang.String project) {
    this.project = project;
  }

  public void unsetProject() {
    this.project = null;
  }

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

  public void setProjectIsSet(boolean value) {
    if (!value) {
      this.project = null;
    }
  }

  public java.lang.String getOwner() {
    return this.owner;
  }

  public void setOwner(java.lang.String owner) {
    this.owner = owner;
  }

  public void unsetOwner() {
    this.owner = null;
  }

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

  public void setOwnerIsSet(boolean value) {
    if (!value) {
      this.owner = null;
    }
  }

  public java.lang.String getApplication() {
    return this.application;
  }

  public void setApplication(java.lang.String application) {
    this.application = application;
  }

  public void unsetApplication() {
    this.application = null;
  }

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

  public void setApplicationIsSet(boolean value) {
    if (!value) {
      this.application = null;
    }
  }

  public java.lang.String getComputeResource() {
    return this.computeResource;
  }

  public void setComputeResource(java.lang.String computeResource) {
    this.computeResource = computeResource;
  }

  public void unsetComputeResource() {
    this.computeResource = null;
  }

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

  public void setComputeResourceIsSet(boolean value) {
    if (!value) {
      this.computeResource = null;
    }
  }

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

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

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

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

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

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

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

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

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

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

  public java.lang.String getJobStatus() {
    return this.jobStatus;
  }

  public void setJobStatus(java.lang.String jobStatus) {
    this.jobStatus = jobStatus;
  }

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

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

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

  public java.lang.String getJobCreationTime() {
    return this.jobCreationTime;
  }

  public void setJobCreationTime(java.lang.String jobCreationTime) {
    this.jobCreationTime = jobCreationTime;
  }

  public void unsetJobCreationTime() {
    this.jobCreationTime = null;
  }

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

  public void setJobCreationTimeIsSet(boolean value) {
    if (!value) {
      this.jobCreationTime = null;
    }
  }

  public java.lang.String getNotificationsTo() {
    return this.notificationsTo;
  }

  public void setNotificationsTo(java.lang.String notificationsTo) {
    this.notificationsTo = notificationsTo;
  }

  public void unsetNotificationsTo() {
    this.notificationsTo = null;
  }

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

  public void setNotificationsToIsSet(boolean value) {
    if (!value) {
      this.notificationsTo = null;
    }
  }

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

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

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

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

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

  public java.lang.String getJobDescription() {
    return this.jobDescription;
  }

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

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

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

  public void setJobDescriptionIsSet(boolean value) {
    if (!value) {
      this.jobDescription = null;
    }
  }

  public java.lang.String getCreationTime() {
    return this.creationTime;
  }

  public void setCreationTime(java.lang.String creationTime) {
    this.creationTime = creationTime;
  }

  public void unsetCreationTime() {
    this.creationTime = null;
  }

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

  public void setCreationTimeIsSet(boolean value) {
    if (!value) {
      this.creationTime = null;
    }
  }

  public java.lang.String getLastModifiedTime() {
    return this.lastModifiedTime;
  }

  public void setLastModifiedTime(java.lang.String lastModifiedTime) {
    this.lastModifiedTime = lastModifiedTime;
  }

  public void unsetLastModifiedTime() {
    this.lastModifiedTime = null;
  }

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

  public void setLastModifiedTimeIsSet(boolean value) {
    if (!value) {
      this.lastModifiedTime = null;
    }
  }

  public java.lang.String getWallTime() {
    return this.wallTime;
  }

  public void setWallTime(java.lang.String wallTime) {
    this.wallTime = wallTime;
  }

  public void unsetWallTime() {
    this.wallTime = null;
  }

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

  public void setWallTimeIsSet(boolean value) {
    if (!value) {
      this.wallTime = null;
    }
  }

  public java.lang.String getCpuCount() {
    return this.cpuCount;
  }

  public void setCpuCount(java.lang.String cpuCount) {
    this.cpuCount = cpuCount;
  }

  public void unsetCpuCount() {
    this.cpuCount = null;
  }

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

  public void setCpuCountIsSet(boolean value) {
    if (!value) {
      this.cpuCount = null;
    }
  }

  public java.lang.String getNodeCount() {
    return this.nodeCount;
  }

  public void setNodeCount(java.lang.String nodeCount) {
    this.nodeCount = nodeCount;
  }

  public void unsetNodeCount() {
    this.nodeCount = null;
  }

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

  public void setNodeCountIsSet(boolean value) {
    if (!value) {
      this.nodeCount = null;
    }
  }

  public java.lang.String getQueue() {
    return this.queue;
  }

  public void setQueue(java.lang.String queue) {
    this.queue = queue;
  }

  public void unsetQueue() {
    this.queue = null;
  }

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

  public void setQueueIsSet(boolean value) {
    if (!value) {
      this.queue = null;
    }
  }

  public java.lang.String getInputs() {
    return this.inputs;
  }

  public void setInputs(java.lang.String inputs) {
    this.inputs = inputs;
  }

  public void unsetInputs() {
    this.inputs = null;
  }

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

  public void setInputsIsSet(boolean value) {
    if (!value) {
      this.inputs = null;
    }
  }

  public java.lang.String getOutputs() {
    return this.outputs;
  }

  public void setOutputs(java.lang.String outputs) {
    this.outputs = outputs;
  }

  public void unsetOutputs() {
    this.outputs = null;
  }

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

  public void setOutputsIsSet(boolean value) {
    if (!value) {
      this.outputs = null;
    }
  }

  public java.lang.String getStorageDir() {
    return this.storageDir;
  }

  public void setStorageDir(java.lang.String storageDir) {
    this.storageDir = storageDir;
  }

  public void unsetStorageDir() {
    this.storageDir = null;
  }

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

  public void setStorageDirIsSet(boolean value) {
    if (!value) {
      this.storageDir = null;
    }
  }

  public java.lang.String getErrors() {
    return this.errors;
  }

  public void setErrors(java.lang.String errors) {
    this.errors = errors;
  }

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

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

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

  public void setFieldValue(_Fields field, java.lang.Object value) {
    switch (field) {
    case AIRAVATA_INTERNAL_USER_ID:
      if (value == null) {
        unsetAiravataInternalUserId();
      } else {
        setAiravataInternalUserId((java.lang.String)value);
      }
      break;

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

    case NAME:
      if (value == null) {
        unsetName();
      } else {
        setName((java.lang.String)value);
      }
      break;

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

    case PROJECT:
      if (value == null) {
        unsetProject();
      } else {
        setProject((java.lang.String)value);
      }
      break;

    case OWNER:
      if (value == null) {
        unsetOwner();
      } else {
        setOwner((java.lang.String)value);
      }
      break;

    case APPLICATION:
      if (value == null) {
        unsetApplication();
      } else {
        setApplication((java.lang.String)value);
      }
      break;

    case COMPUTE_RESOURCE:
      if (value == null) {
        unsetComputeResource();
      } else {
        setComputeResource((java.lang.String)value);
      }
      break;

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

    case JOB_ID:
      if (value == null) {
        unsetJobId();
      } else {
        setJobId((java.lang.String)value);
      }
      break;

    case JOB_STATUS:
      if (value == null) {
        unsetJobStatus();
      } else {
        setJobStatus((java.lang.String)value);
      }
      break;

    case JOB_CREATION_TIME:
      if (value == null) {
        unsetJobCreationTime();
      } else {
        setJobCreationTime((java.lang.String)value);
      }
      break;

    case NOTIFICATIONS_TO:
      if (value == null) {
        unsetNotificationsTo();
      } else {
        setNotificationsTo((java.lang.String)value);
      }
      break;

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

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

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

    case LAST_MODIFIED_TIME:
      if (value == null) {
        unsetLastModifiedTime();
      } else {
        setLastModifiedTime((java.lang.String)value);
      }
      break;

    case WALL_TIME:
      if (value == null) {
        unsetWallTime();
      } else {
        setWallTime((java.lang.String)value);
      }
      break;

    case CPU_COUNT:
      if (value == null) {
        unsetCpuCount();
      } else {
        setCpuCount((java.lang.String)value);
      }
      break;

    case NODE_COUNT:
      if (value == null) {
        unsetNodeCount();
      } else {
        setNodeCount((java.lang.String)value);
      }
      break;

    case QUEUE:
      if (value == null) {
        unsetQueue();
      } else {
        setQueue((java.lang.String)value);
      }
      break;

    case INPUTS:
      if (value == null) {
        unsetInputs();
      } else {
        setInputs((java.lang.String)value);
      }
      break;

    case OUTPUTS:
      if (value == null) {
        unsetOutputs();
      } else {
        setOutputs((java.lang.String)value);
      }
      break;

    case STORAGE_DIR:
      if (value == null) {
        unsetStorageDir();
      } else {
        setStorageDir((java.lang.String)value);
      }
      break;

    case ERRORS:
      if (value == null) {
        unsetErrors();
      } else {
        setErrors((java.lang.String)value);
      }
      break;

    }
  }

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

    case EXPERIMENT_ID:
      return getExperimentId();

    case NAME:
      return getName();

    case DESCRIPTION:
      return getDescription();

    case PROJECT:
      return getProject();

    case OWNER:
      return getOwner();

    case APPLICATION:
      return getApplication();

    case COMPUTE_RESOURCE:
      return getComputeResource();

    case JOB_NAME:
      return getJobName();

    case JOB_ID:
      return getJobId();

    case JOB_STATUS:
      return getJobStatus();

    case JOB_CREATION_TIME:
      return getJobCreationTime();

    case NOTIFICATIONS_TO:
      return getNotificationsTo();

    case WORKING_DIR:
      return getWorkingDir();

    case JOB_DESCRIPTION:
      return getJobDescription();

    case CREATION_TIME:
      return getCreationTime();

    case LAST_MODIFIED_TIME:
      return getLastModifiedTime();

    case WALL_TIME:
      return getWallTime();

    case CPU_COUNT:
      return getCpuCount();

    case NODE_COUNT:
      return getNodeCount();

    case QUEUE:
      return getQueue();

    case INPUTS:
      return getInputs();

    case OUTPUTS:
      return getOutputs();

    case STORAGE_DIR:
      return getStorageDir();

    case ERRORS:
      return getErrors();

    }
    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 AIRAVATA_INTERNAL_USER_ID:
      return isSetAiravataInternalUserId();
    case EXPERIMENT_ID:
      return isSetExperimentId();
    case NAME:
      return isSetName();
    case DESCRIPTION:
      return isSetDescription();
    case PROJECT:
      return isSetProject();
    case OWNER:
      return isSetOwner();
    case APPLICATION:
      return isSetApplication();
    case COMPUTE_RESOURCE:
      return isSetComputeResource();
    case JOB_NAME:
      return isSetJobName();
    case JOB_ID:
      return isSetJobId();
    case JOB_STATUS:
      return isSetJobStatus();
    case JOB_CREATION_TIME:
      return isSetJobCreationTime();
    case NOTIFICATIONS_TO:
      return isSetNotificationsTo();
    case WORKING_DIR:
      return isSetWorkingDir();
    case JOB_DESCRIPTION:
      return isSetJobDescription();
    case CREATION_TIME:
      return isSetCreationTime();
    case LAST_MODIFIED_TIME:
      return isSetLastModifiedTime();
    case WALL_TIME:
      return isSetWallTime();
    case CPU_COUNT:
      return isSetCpuCount();
    case NODE_COUNT:
      return isSetNodeCount();
    case QUEUE:
      return isSetQueue();
    case INPUTS:
      return isSetInputs();
    case OUTPUTS:
      return isSetOutputs();
    case STORAGE_DIR:
      return isSetStorageDir();
    case ERRORS:
      return isSetErrors();
    }
    throw new java.lang.IllegalStateException();
  }

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

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

    boolean this_present_airavataInternalUserId = true && this.isSetAiravataInternalUserId();
    boolean that_present_airavataInternalUserId = true && that.isSetAiravataInternalUserId();
    if (this_present_airavataInternalUserId || that_present_airavataInternalUserId) {
      if (!(this_present_airavataInternalUserId && that_present_airavataInternalUserId))
        return false;
      if (!this.airavataInternalUserId.equals(that.airavataInternalUserId))
        return false;
    }

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

    boolean this_present_name = true && this.isSetName();
    boolean that_present_name = true && that.isSetName();
    if (this_present_name || that_present_name) {
      if (!(this_present_name && that_present_name))
        return false;
      if (!this.name.equals(that.name))
        return false;
    }

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

    boolean this_present_project = true && this.isSetProject();
    boolean that_present_project = true && that.isSetProject();
    if (this_present_project || that_present_project) {
      if (!(this_present_project && that_present_project))
        return false;
      if (!this.project.equals(that.project))
        return false;
    }

    boolean this_present_owner = true && this.isSetOwner();
    boolean that_present_owner = true && that.isSetOwner();
    if (this_present_owner || that_present_owner) {
      if (!(this_present_owner && that_present_owner))
        return false;
      if (!this.owner.equals(that.owner))
        return false;
    }

    boolean this_present_application = true && this.isSetApplication();
    boolean that_present_application = true && that.isSetApplication();
    if (this_present_application || that_present_application) {
      if (!(this_present_application && that_present_application))
        return false;
      if (!this.application.equals(that.application))
        return false;
    }

    boolean this_present_computeResource = true && this.isSetComputeResource();
    boolean that_present_computeResource = true && that.isSetComputeResource();
    if (this_present_computeResource || that_present_computeResource) {
      if (!(this_present_computeResource && that_present_computeResource))
        return false;
      if (!this.computeResource.equals(that.computeResource))
        return false;
    }

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

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

    boolean this_present_jobStatus = true && this.isSetJobStatus();
    boolean that_present_jobStatus = true && that.isSetJobStatus();
    if (this_present_jobStatus || that_present_jobStatus) {
      if (!(this_present_jobStatus && that_present_jobStatus))
        return false;
      if (!this.jobStatus.equals(that.jobStatus))
        return false;
    }

    boolean this_present_jobCreationTime = true && this.isSetJobCreationTime();
    boolean that_present_jobCreationTime = true && that.isSetJobCreationTime();
    if (this_present_jobCreationTime || that_present_jobCreationTime) {
      if (!(this_present_jobCreationTime && that_present_jobCreationTime))
        return false;
      if (!this.jobCreationTime.equals(that.jobCreationTime))
        return false;
    }

    boolean this_present_notificationsTo = true && this.isSetNotificationsTo();
    boolean that_present_notificationsTo = true && that.isSetNotificationsTo();
    if (this_present_notificationsTo || that_present_notificationsTo) {
      if (!(this_present_notificationsTo && that_present_notificationsTo))
        return false;
      if (!this.notificationsTo.equals(that.notificationsTo))
        return false;
    }

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

    boolean this_present_jobDescription = true && this.isSetJobDescription();
    boolean that_present_jobDescription = true && that.isSetJobDescription();
    if (this_present_jobDescription || that_present_jobDescription) {
      if (!(this_present_jobDescription && that_present_jobDescription))
        return false;
      if (!this.jobDescription.equals(that.jobDescription))
        return false;
    }

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

    boolean this_present_lastModifiedTime = true && this.isSetLastModifiedTime();
    boolean that_present_lastModifiedTime = true && that.isSetLastModifiedTime();
    if (this_present_lastModifiedTime || that_present_lastModifiedTime) {
      if (!(this_present_lastModifiedTime && that_present_lastModifiedTime))
        return false;
      if (!this.lastModifiedTime.equals(that.lastModifiedTime))
        return false;
    }

    boolean this_present_wallTime = true && this.isSetWallTime();
    boolean that_present_wallTime = true && that.isSetWallTime();
    if (this_present_wallTime || that_present_wallTime) {
      if (!(this_present_wallTime && that_present_wallTime))
        return false;
      if (!this.wallTime.equals(that.wallTime))
        return false;
    }

    boolean this_present_cpuCount = true && this.isSetCpuCount();
    boolean that_present_cpuCount = true && that.isSetCpuCount();
    if (this_present_cpuCount || that_present_cpuCount) {
      if (!(this_present_cpuCount && that_present_cpuCount))
        return false;
      if (!this.cpuCount.equals(that.cpuCount))
        return false;
    }

    boolean this_present_nodeCount = true && this.isSetNodeCount();
    boolean that_present_nodeCount = true && that.isSetNodeCount();
    if (this_present_nodeCount || that_present_nodeCount) {
      if (!(this_present_nodeCount && that_present_nodeCount))
        return false;
      if (!this.nodeCount.equals(that.nodeCount))
        return false;
    }

    boolean this_present_queue = true && this.isSetQueue();
    boolean that_present_queue = true && that.isSetQueue();
    if (this_present_queue || that_present_queue) {
      if (!(this_present_queue && that_present_queue))
        return false;
      if (!this.queue.equals(that.queue))
        return false;
    }

    boolean this_present_inputs = true && this.isSetInputs();
    boolean that_present_inputs = true && that.isSetInputs();
    if (this_present_inputs || that_present_inputs) {
      if (!(this_present_inputs && that_present_inputs))
        return false;
      if (!this.inputs.equals(that.inputs))
        return false;
    }

    boolean this_present_outputs = true && this.isSetOutputs();
    boolean that_present_outputs = true && that.isSetOutputs();
    if (this_present_outputs || that_present_outputs) {
      if (!(this_present_outputs && that_present_outputs))
        return false;
      if (!this.outputs.equals(that.outputs))
        return false;
    }

    boolean this_present_storageDir = true && this.isSetStorageDir();
    boolean that_present_storageDir = true && that.isSetStorageDir();
    if (this_present_storageDir || that_present_storageDir) {
      if (!(this_present_storageDir && that_present_storageDir))
        return false;
      if (!this.storageDir.equals(that.storageDir))
        return false;
    }

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

    return true;
  }

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

    hashCode = hashCode * 8191 + ((isSetAiravataInternalUserId()) ? 131071 : 524287);
    if (isSetAiravataInternalUserId())
      hashCode = hashCode * 8191 + airavataInternalUserId.hashCode();

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

    hashCode = hashCode * 8191 + ((isSetName()) ? 131071 : 524287);
    if (isSetName())
      hashCode = hashCode * 8191 + name.hashCode();

    hashCode = hashCode * 8191 + ((isSetDescription()) ? 131071 : 524287);
    if (isSetDescription())
      hashCode = hashCode * 8191 + description.hashCode();

    hashCode = hashCode * 8191 + ((isSetProject()) ? 131071 : 524287);
    if (isSetProject())
      hashCode = hashCode * 8191 + project.hashCode();

    hashCode = hashCode * 8191 + ((isSetOwner()) ? 131071 : 524287);
    if (isSetOwner())
      hashCode = hashCode * 8191 + owner.hashCode();

    hashCode = hashCode * 8191 + ((isSetApplication()) ? 131071 : 524287);
    if (isSetApplication())
      hashCode = hashCode * 8191 + application.hashCode();

    hashCode = hashCode * 8191 + ((isSetComputeResource()) ? 131071 : 524287);
    if (isSetComputeResource())
      hashCode = hashCode * 8191 + computeResource.hashCode();

    hashCode = hashCode * 8191 + ((isSetJobName()) ? 131071 : 524287);
    if (isSetJobName())
      hashCode = hashCode * 8191 + jobName.hashCode();

    hashCode = hashCode * 8191 + ((isSetJobId()) ? 131071 : 524287);
    if (isSetJobId())
      hashCode = hashCode * 8191 + jobId.hashCode();

    hashCode = hashCode * 8191 + ((isSetJobStatus()) ? 131071 : 524287);
    if (isSetJobStatus())
      hashCode = hashCode * 8191 + jobStatus.hashCode();

    hashCode = hashCode * 8191 + ((isSetJobCreationTime()) ? 131071 : 524287);
    if (isSetJobCreationTime())
      hashCode = hashCode * 8191 + jobCreationTime.hashCode();

    hashCode = hashCode * 8191 + ((isSetNotificationsTo()) ? 131071 : 524287);
    if (isSetNotificationsTo())
      hashCode = hashCode * 8191 + notificationsTo.hashCode();

    hashCode = hashCode * 8191 + ((isSetWorkingDir()) ? 131071 : 524287);
    if (isSetWorkingDir())
      hashCode = hashCode * 8191 + workingDir.hashCode();

    hashCode = hashCode * 8191 + ((isSetJobDescription()) ? 131071 : 524287);
    if (isSetJobDescription())
      hashCode = hashCode * 8191 + jobDescription.hashCode();

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

    hashCode = hashCode * 8191 + ((isSetLastModifiedTime()) ? 131071 : 524287);
    if (isSetLastModifiedTime())
      hashCode = hashCode * 8191 + lastModifiedTime.hashCode();

    hashCode = hashCode * 8191 + ((isSetWallTime()) ? 131071 : 524287);
    if (isSetWallTime())
      hashCode = hashCode * 8191 + wallTime.hashCode();

    hashCode = hashCode * 8191 + ((isSetCpuCount()) ? 131071 : 524287);
    if (isSetCpuCount())
      hashCode = hashCode * 8191 + cpuCount.hashCode();

    hashCode = hashCode * 8191 + ((isSetNodeCount()) ? 131071 : 524287);
    if (isSetNodeCount())
      hashCode = hashCode * 8191 + nodeCount.hashCode();

    hashCode = hashCode * 8191 + ((isSetQueue()) ? 131071 : 524287);
    if (isSetQueue())
      hashCode = hashCode * 8191 + queue.hashCode();

    hashCode = hashCode * 8191 + ((isSetInputs()) ? 131071 : 524287);
    if (isSetInputs())
      hashCode = hashCode * 8191 + inputs.hashCode();

    hashCode = hashCode * 8191 + ((isSetOutputs()) ? 131071 : 524287);
    if (isSetOutputs())
      hashCode = hashCode * 8191 + outputs.hashCode();

    hashCode = hashCode * 8191 + ((isSetStorageDir()) ? 131071 : 524287);
    if (isSetStorageDir())
      hashCode = hashCode * 8191 + storageDir.hashCode();

    hashCode = hashCode * 8191 + ((isSetErrors()) ? 131071 : 524287);
    if (isSetErrors())
      hashCode = hashCode * 8191 + errors.hashCode();

    return hashCode;
  }

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

    int lastComparison = 0;

    lastComparison = java.lang.Boolean.valueOf(isSetAiravataInternalUserId()).compareTo(other.isSetAiravataInternalUserId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetAiravataInternalUserId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.airavataInternalUserId, other.airavataInternalUserId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetExperimentId()).compareTo(other.isSetExperimentId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetExperimentId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.experimentId, other.experimentId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetName()).compareTo(other.isSetName());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetName()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.name, other.name);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetDescription()).compareTo(other.isSetDescription());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetDescription()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.description, other.description);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetProject()).compareTo(other.isSetProject());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetProject()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.project, other.project);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetOwner()).compareTo(other.isSetOwner());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetOwner()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.owner, other.owner);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetApplication()).compareTo(other.isSetApplication());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetApplication()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.application, other.application);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetComputeResource()).compareTo(other.isSetComputeResource());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetComputeResource()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.computeResource, other.computeResource);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetJobName()).compareTo(other.isSetJobName());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetJobName()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.jobName, other.jobName);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetJobId()).compareTo(other.isSetJobId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetJobId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.jobId, other.jobId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetJobStatus()).compareTo(other.isSetJobStatus());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetJobStatus()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.jobStatus, other.jobStatus);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetJobCreationTime()).compareTo(other.isSetJobCreationTime());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetJobCreationTime()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.jobCreationTime, other.jobCreationTime);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetNotificationsTo()).compareTo(other.isSetNotificationsTo());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetNotificationsTo()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.notificationsTo, other.notificationsTo);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetWorkingDir()).compareTo(other.isSetWorkingDir());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetWorkingDir()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.workingDir, other.workingDir);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetJobDescription()).compareTo(other.isSetJobDescription());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetJobDescription()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.jobDescription, other.jobDescription);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetCreationTime()).compareTo(other.isSetCreationTime());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetCreationTime()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.creationTime, other.creationTime);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetLastModifiedTime()).compareTo(other.isSetLastModifiedTime());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetLastModifiedTime()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.lastModifiedTime, other.lastModifiedTime);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetWallTime()).compareTo(other.isSetWallTime());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetWallTime()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.wallTime, other.wallTime);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetCpuCount()).compareTo(other.isSetCpuCount());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetCpuCount()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.cpuCount, other.cpuCount);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetNodeCount()).compareTo(other.isSetNodeCount());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetNodeCount()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.nodeCount, other.nodeCount);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetQueue()).compareTo(other.isSetQueue());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetQueue()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.queue, other.queue);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetInputs()).compareTo(other.isSetInputs());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetInputs()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.inputs, other.inputs);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetOutputs()).compareTo(other.isSetOutputs());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetOutputs()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.outputs, other.outputs);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetStorageDir()).compareTo(other.isSetStorageDir());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetStorageDir()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.storageDir, other.storageDir);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetErrors()).compareTo(other.isSetErrors());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetErrors()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.errors, other.errors);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    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("CustomDashboard(");
    boolean first = true;

    sb.append("airavataInternalUserId:");
    if (this.airavataInternalUserId == null) {
      sb.append("null");
    } else {
      sb.append(this.airavataInternalUserId);
    }
    first = false;
    if (isSetExperimentId()) {
      if (!first) sb.append(", ");
      sb.append("experimentId:");
      if (this.experimentId == null) {
        sb.append("null");
      } else {
        sb.append(this.experimentId);
      }
      first = false;
    }
    if (isSetName()) {
      if (!first) sb.append(", ");
      sb.append("name:");
      if (this.name == null) {
        sb.append("null");
      } else {
        sb.append(this.name);
      }
      first = false;
    }
    if (isSetDescription()) {
      if (!first) sb.append(", ");
      sb.append("description:");
      if (this.description == null) {
        sb.append("null");
      } else {
        sb.append(this.description);
      }
      first = false;
    }
    if (isSetProject()) {
      if (!first) sb.append(", ");
      sb.append("project:");
      if (this.project == null) {
        sb.append("null");
      } else {
        sb.append(this.project);
      }
      first = false;
    }
    if (isSetOwner()) {
      if (!first) sb.append(", ");
      sb.append("owner:");
      if (this.owner == null) {
        sb.append("null");
      } else {
        sb.append(this.owner);
      }
      first = false;
    }
    if (isSetApplication()) {
      if (!first) sb.append(", ");
      sb.append("application:");
      if (this.application == null) {
        sb.append("null");
      } else {
        sb.append(this.application);
      }
      first = false;
    }
    if (isSetComputeResource()) {
      if (!first) sb.append(", ");
      sb.append("computeResource:");
      if (this.computeResource == null) {
        sb.append("null");
      } else {
        sb.append(this.computeResource);
      }
      first = false;
    }
    if (isSetJobName()) {
      if (!first) sb.append(", ");
      sb.append("jobName:");
      if (this.jobName == null) {
        sb.append("null");
      } else {
        sb.append(this.jobName);
      }
      first = false;
    }
    if (isSetJobId()) {
      if (!first) sb.append(", ");
      sb.append("jobId:");
      if (this.jobId == null) {
        sb.append("null");
      } else {
        sb.append(this.jobId);
      }
      first = false;
    }
    if (isSetJobStatus()) {
      if (!first) sb.append(", ");
      sb.append("jobStatus:");
      if (this.jobStatus == null) {
        sb.append("null");
      } else {
        sb.append(this.jobStatus);
      }
      first = false;
    }
    if (isSetJobCreationTime()) {
      if (!first) sb.append(", ");
      sb.append("jobCreationTime:");
      if (this.jobCreationTime == null) {
        sb.append("null");
      } else {
        sb.append(this.jobCreationTime);
      }
      first = false;
    }
    if (isSetNotificationsTo()) {
      if (!first) sb.append(", ");
      sb.append("notificationsTo:");
      if (this.notificationsTo == null) {
        sb.append("null");
      } else {
        sb.append(this.notificationsTo);
      }
      first = false;
    }
    if (isSetWorkingDir()) {
      if (!first) sb.append(", ");
      sb.append("workingDir:");
      if (this.workingDir == null) {
        sb.append("null");
      } else {
        sb.append(this.workingDir);
      }
      first = false;
    }
    if (isSetJobDescription()) {
      if (!first) sb.append(", ");
      sb.append("jobDescription:");
      if (this.jobDescription == null) {
        sb.append("null");
      } else {
        sb.append(this.jobDescription);
      }
      first = false;
    }
    if (isSetCreationTime()) {
      if (!first) sb.append(", ");
      sb.append("creationTime:");
      if (this.creationTime == null) {
        sb.append("null");
      } else {
        sb.append(this.creationTime);
      }
      first = false;
    }
    if (isSetLastModifiedTime()) {
      if (!first) sb.append(", ");
      sb.append("lastModifiedTime:");
      if (this.lastModifiedTime == null) {
        sb.append("null");
      } else {
        sb.append(this.lastModifiedTime);
      }
      first = false;
    }
    if (isSetWallTime()) {
      if (!first) sb.append(", ");
      sb.append("wallTime:");
      if (this.wallTime == null) {
        sb.append("null");
      } else {
        sb.append(this.wallTime);
      }
      first = false;
    }
    if (isSetCpuCount()) {
      if (!first) sb.append(", ");
      sb.append("cpuCount:");
      if (this.cpuCount == null) {
        sb.append("null");
      } else {
        sb.append(this.cpuCount);
      }
      first = false;
    }
    if (isSetNodeCount()) {
      if (!first) sb.append(", ");
      sb.append("nodeCount:");
      if (this.nodeCount == null) {
        sb.append("null");
      } else {
        sb.append(this.nodeCount);
      }
      first = false;
    }
    if (isSetQueue()) {
      if (!first) sb.append(", ");
      sb.append("queue:");
      if (this.queue == null) {
        sb.append("null");
      } else {
        sb.append(this.queue);
      }
      first = false;
    }
    if (isSetInputs()) {
      if (!first) sb.append(", ");
      sb.append("inputs:");
      if (this.inputs == null) {
        sb.append("null");
      } else {
        sb.append(this.inputs);
      }
      first = false;
    }
    if (isSetOutputs()) {
      if (!first) sb.append(", ");
      sb.append("outputs:");
      if (this.outputs == null) {
        sb.append("null");
      } else {
        sb.append(this.outputs);
      }
      first = false;
    }
    if (isSetStorageDir()) {
      if (!first) sb.append(", ");
      sb.append("storageDir:");
      if (this.storageDir == null) {
        sb.append("null");
      } else {
        sb.append(this.storageDir);
      }
      first = false;
    }
    if (isSetErrors()) {
      if (!first) sb.append(", ");
      sb.append("errors:");
      if (this.errors == null) {
        sb.append("null");
      } else {
        sb.append(this.errors);
      }
      first = false;
    }
    sb.append(")");
    return sb.toString();
  }

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

    // check for sub-struct validity
  }

  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 {
      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 CustomDashboardStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
    public CustomDashboardStandardScheme getScheme() {
      return new CustomDashboardStandardScheme();
    }
  }

  private static class CustomDashboardStandardScheme extends org.apache.thrift.scheme.StandardScheme<CustomDashboard> {

    public void read(org.apache.thrift.protocol.TProtocol iprot, CustomDashboard 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: // AIRAVATA_INTERNAL_USER_ID
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.airavataInternalUserId = iprot.readString();
              struct.setAiravataInternalUserIdIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 2: // EXPERIMENT_ID
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.experimentId = iprot.readString();
              struct.setExperimentIdIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 3: // NAME
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.name = iprot.readString();
              struct.setNameIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 4: // DESCRIPTION
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.description = iprot.readString();
              struct.setDescriptionIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 5: // PROJECT
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.project = iprot.readString();
              struct.setProjectIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 6: // OWNER
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.owner = iprot.readString();
              struct.setOwnerIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 7: // APPLICATION
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.application = iprot.readString();
              struct.setApplicationIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 8: // COMPUTE_RESOURCE
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.computeResource = iprot.readString();
              struct.setComputeResourceIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 9: // JOB_NAME
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.jobName = iprot.readString();
              struct.setJobNameIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 10: // JOB_ID
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.jobId = iprot.readString();
              struct.setJobIdIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 11: // JOB_STATUS
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.jobStatus = iprot.readString();
              struct.setJobStatusIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 12: // JOB_CREATION_TIME
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.jobCreationTime = iprot.readString();
              struct.setJobCreationTimeIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 13: // NOTIFICATIONS_TO
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.notificationsTo = iprot.readString();
              struct.setNotificationsToIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 14: // WORKING_DIR
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.workingDir = iprot.readString();
              struct.setWorkingDirIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 15: // JOB_DESCRIPTION
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.jobDescription = iprot.readString();
              struct.setJobDescriptionIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 16: // CREATION_TIME
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.creationTime = iprot.readString();
              struct.setCreationTimeIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 17: // LAST_MODIFIED_TIME
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.lastModifiedTime = iprot.readString();
              struct.setLastModifiedTimeIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 18: // WALL_TIME
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.wallTime = iprot.readString();
              struct.setWallTimeIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 19: // CPU_COUNT
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.cpuCount = iprot.readString();
              struct.setCpuCountIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 20: // NODE_COUNT
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.nodeCount = iprot.readString();
              struct.setNodeCountIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 21: // QUEUE
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.queue = iprot.readString();
              struct.setQueueIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 22: // INPUTS
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.inputs = iprot.readString();
              struct.setInputsIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 23: // OUTPUTS
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.outputs = iprot.readString();
              struct.setOutputsIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 24: // STORAGE_DIR
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.storageDir = iprot.readString();
              struct.setStorageDirIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 25: // ERRORS
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.errors = iprot.readString();
              struct.setErrorsIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          default:
            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
        }
        iprot.readFieldEnd();
      }
      iprot.readStructEnd();
      struct.validate();
    }

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

      oprot.writeStructBegin(STRUCT_DESC);
      if (struct.airavataInternalUserId != null) {
        oprot.writeFieldBegin(AIRAVATA_INTERNAL_USER_ID_FIELD_DESC);
        oprot.writeString(struct.airavataInternalUserId);
        oprot.writeFieldEnd();
      }
      if (struct.experimentId != null) {
        if (struct.isSetExperimentId()) {
          oprot.writeFieldBegin(EXPERIMENT_ID_FIELD_DESC);
          oprot.writeString(struct.experimentId);
          oprot.writeFieldEnd();
        }
      }
      if (struct.name != null) {
        if (struct.isSetName()) {
          oprot.writeFieldBegin(NAME_FIELD_DESC);
          oprot.writeString(struct.name);
          oprot.writeFieldEnd();
        }
      }
      if (struct.description != null) {
        if (struct.isSetDescription()) {
          oprot.writeFieldBegin(DESCRIPTION_FIELD_DESC);
          oprot.writeString(struct.description);
          oprot.writeFieldEnd();
        }
      }
      if (struct.project != null) {
        if (struct.isSetProject()) {
          oprot.writeFieldBegin(PROJECT_FIELD_DESC);
          oprot.writeString(struct.project);
          oprot.writeFieldEnd();
        }
      }
      if (struct.owner != null) {
        if (struct.isSetOwner()) {
          oprot.writeFieldBegin(OWNER_FIELD_DESC);
          oprot.writeString(struct.owner);
          oprot.writeFieldEnd();
        }
      }
      if (struct.application != null) {
        if (struct.isSetApplication()) {
          oprot.writeFieldBegin(APPLICATION_FIELD_DESC);
          oprot.writeString(struct.application);
          oprot.writeFieldEnd();
        }
      }
      if (struct.computeResource != null) {
        if (struct.isSetComputeResource()) {
          oprot.writeFieldBegin(COMPUTE_RESOURCE_FIELD_DESC);
          oprot.writeString(struct.computeResource);
          oprot.writeFieldEnd();
        }
      }
      if (struct.jobName != null) {
        if (struct.isSetJobName()) {
          oprot.writeFieldBegin(JOB_NAME_FIELD_DESC);
          oprot.writeString(struct.jobName);
          oprot.writeFieldEnd();
        }
      }
      if (struct.jobId != null) {
        if (struct.isSetJobId()) {
          oprot.writeFieldBegin(JOB_ID_FIELD_DESC);
          oprot.writeString(struct.jobId);
          oprot.writeFieldEnd();
        }
      }
      if (struct.jobStatus != null) {
        if (struct.isSetJobStatus()) {
          oprot.writeFieldBegin(JOB_STATUS_FIELD_DESC);
          oprot.writeString(struct.jobStatus);
          oprot.writeFieldEnd();
        }
      }
      if (struct.jobCreationTime != null) {
        if (struct.isSetJobCreationTime()) {
          oprot.writeFieldBegin(JOB_CREATION_TIME_FIELD_DESC);
          oprot.writeString(struct.jobCreationTime);
          oprot.writeFieldEnd();
        }
      }
      if (struct.notificationsTo != null) {
        if (struct.isSetNotificationsTo()) {
          oprot.writeFieldBegin(NOTIFICATIONS_TO_FIELD_DESC);
          oprot.writeString(struct.notificationsTo);
          oprot.writeFieldEnd();
        }
      }
      if (struct.workingDir != null) {
        if (struct.isSetWorkingDir()) {
          oprot.writeFieldBegin(WORKING_DIR_FIELD_DESC);
          oprot.writeString(struct.workingDir);
          oprot.writeFieldEnd();
        }
      }
      if (struct.jobDescription != null) {
        if (struct.isSetJobDescription()) {
          oprot.writeFieldBegin(JOB_DESCRIPTION_FIELD_DESC);
          oprot.writeString(struct.jobDescription);
          oprot.writeFieldEnd();
        }
      }
      if (struct.creationTime != null) {
        if (struct.isSetCreationTime()) {
          oprot.writeFieldBegin(CREATION_TIME_FIELD_DESC);
          oprot.writeString(struct.creationTime);
          oprot.writeFieldEnd();
        }
      }
      if (struct.lastModifiedTime != null) {
        if (struct.isSetLastModifiedTime()) {
          oprot.writeFieldBegin(LAST_MODIFIED_TIME_FIELD_DESC);
          oprot.writeString(struct.lastModifiedTime);
          oprot.writeFieldEnd();
        }
      }
      if (struct.wallTime != null) {
        if (struct.isSetWallTime()) {
          oprot.writeFieldBegin(WALL_TIME_FIELD_DESC);
          oprot.writeString(struct.wallTime);
          oprot.writeFieldEnd();
        }
      }
      if (struct.cpuCount != null) {
        if (struct.isSetCpuCount()) {
          oprot.writeFieldBegin(CPU_COUNT_FIELD_DESC);
          oprot.writeString(struct.cpuCount);
          oprot.writeFieldEnd();
        }
      }
      if (struct.nodeCount != null) {
        if (struct.isSetNodeCount()) {
          oprot.writeFieldBegin(NODE_COUNT_FIELD_DESC);
          oprot.writeString(struct.nodeCount);
          oprot.writeFieldEnd();
        }
      }
      if (struct.queue != null) {
        if (struct.isSetQueue()) {
          oprot.writeFieldBegin(QUEUE_FIELD_DESC);
          oprot.writeString(struct.queue);
          oprot.writeFieldEnd();
        }
      }
      if (struct.inputs != null) {
        if (struct.isSetInputs()) {
          oprot.writeFieldBegin(INPUTS_FIELD_DESC);
          oprot.writeString(struct.inputs);
          oprot.writeFieldEnd();
        }
      }
      if (struct.outputs != null) {
        if (struct.isSetOutputs()) {
          oprot.writeFieldBegin(OUTPUTS_FIELD_DESC);
          oprot.writeString(struct.outputs);
          oprot.writeFieldEnd();
        }
      }
      if (struct.storageDir != null) {
        if (struct.isSetStorageDir()) {
          oprot.writeFieldBegin(STORAGE_DIR_FIELD_DESC);
          oprot.writeString(struct.storageDir);
          oprot.writeFieldEnd();
        }
      }
      if (struct.errors != null) {
        if (struct.isSetErrors()) {
          oprot.writeFieldBegin(ERRORS_FIELD_DESC);
          oprot.writeString(struct.errors);
          oprot.writeFieldEnd();
        }
      }
      oprot.writeFieldStop();
      oprot.writeStructEnd();
    }

  }

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

  private static class CustomDashboardTupleScheme extends org.apache.thrift.scheme.TupleScheme<CustomDashboard> {

    @Override
    public void write(org.apache.thrift.protocol.TProtocol prot, CustomDashboard struct) throws org.apache.thrift.TException {
      org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
      oprot.writeString(struct.airavataInternalUserId);
      java.util.BitSet optionals = new java.util.BitSet();
      if (struct.isSetExperimentId()) {
        optionals.set(0);
      }
      if (struct.isSetName()) {
        optionals.set(1);
      }
      if (struct.isSetDescription()) {
        optionals.set(2);
      }
      if (struct.isSetProject()) {
        optionals.set(3);
      }
      if (struct.isSetOwner()) {
        optionals.set(4);
      }
      if (struct.isSetApplication()) {
        optionals.set(5);
      }
      if (struct.isSetComputeResource()) {
        optionals.set(6);
      }
      if (struct.isSetJobName()) {
        optionals.set(7);
      }
      if (struct.isSetJobId()) {
        optionals.set(8);
      }
      if (struct.isSetJobStatus()) {
        optionals.set(9);
      }
      if (struct.isSetJobCreationTime()) {
        optionals.set(10);
      }
      if (struct.isSetNotificationsTo()) {
        optionals.set(11);
      }
      if (struct.isSetWorkingDir()) {
        optionals.set(12);
      }
      if (struct.isSetJobDescription()) {
        optionals.set(13);
      }
      if (struct.isSetCreationTime()) {
        optionals.set(14);
      }
      if (struct.isSetLastModifiedTime()) {
        optionals.set(15);
      }
      if (struct.isSetWallTime()) {
        optionals.set(16);
      }
      if (struct.isSetCpuCount()) {
        optionals.set(17);
      }
      if (struct.isSetNodeCount()) {
        optionals.set(18);
      }
      if (struct.isSetQueue()) {
        optionals.set(19);
      }
      if (struct.isSetInputs()) {
        optionals.set(20);
      }
      if (struct.isSetOutputs()) {
        optionals.set(21);
      }
      if (struct.isSetStorageDir()) {
        optionals.set(22);
      }
      if (struct.isSetErrors()) {
        optionals.set(23);
      }
      oprot.writeBitSet(optionals, 24);
      if (struct.isSetExperimentId()) {
        oprot.writeString(struct.experimentId);
      }
      if (struct.isSetName()) {
        oprot.writeString(struct.name);
      }
      if (struct.isSetDescription()) {
        oprot.writeString(struct.description);
      }
      if (struct.isSetProject()) {
        oprot.writeString(struct.project);
      }
      if (struct.isSetOwner()) {
        oprot.writeString(struct.owner);
      }
      if (struct.isSetApplication()) {
        oprot.writeString(struct.application);
      }
      if (struct.isSetComputeResource()) {
        oprot.writeString(struct.computeResource);
      }
      if (struct.isSetJobName()) {
        oprot.writeString(struct.jobName);
      }
      if (struct.isSetJobId()) {
        oprot.writeString(struct.jobId);
      }
      if (struct.isSetJobStatus()) {
        oprot.writeString(struct.jobStatus);
      }
      if (struct.isSetJobCreationTime()) {
        oprot.writeString(struct.jobCreationTime);
      }
      if (struct.isSetNotificationsTo()) {
        oprot.writeString(struct.notificationsTo);
      }
      if (struct.isSetWorkingDir()) {
        oprot.writeString(struct.workingDir);
      }
      if (struct.isSetJobDescription()) {
        oprot.writeString(struct.jobDescription);
      }
      if (struct.isSetCreationTime()) {
        oprot.writeString(struct.creationTime);
      }
      if (struct.isSetLastModifiedTime()) {
        oprot.writeString(struct.lastModifiedTime);
      }
      if (struct.isSetWallTime()) {
        oprot.writeString(struct.wallTime);
      }
      if (struct.isSetCpuCount()) {
        oprot.writeString(struct.cpuCount);
      }
      if (struct.isSetNodeCount()) {
        oprot.writeString(struct.nodeCount);
      }
      if (struct.isSetQueue()) {
        oprot.writeString(struct.queue);
      }
      if (struct.isSetInputs()) {
        oprot.writeString(struct.inputs);
      }
      if (struct.isSetOutputs()) {
        oprot.writeString(struct.outputs);
      }
      if (struct.isSetStorageDir()) {
        oprot.writeString(struct.storageDir);
      }
      if (struct.isSetErrors()) {
        oprot.writeString(struct.errors);
      }
    }

    @Override
    public void read(org.apache.thrift.protocol.TProtocol prot, CustomDashboard struct) throws org.apache.thrift.TException {
      org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
      struct.airavataInternalUserId = iprot.readString();
      struct.setAiravataInternalUserIdIsSet(true);
      java.util.BitSet incoming = iprot.readBitSet(24);
      if (incoming.get(0)) {
        struct.experimentId = iprot.readString();
        struct.setExperimentIdIsSet(true);
      }
      if (incoming.get(1)) {
        struct.name = iprot.readString();
        struct.setNameIsSet(true);
      }
      if (incoming.get(2)) {
        struct.description = iprot.readString();
        struct.setDescriptionIsSet(true);
      }
      if (incoming.get(3)) {
        struct.project = iprot.readString();
        struct.setProjectIsSet(true);
      }
      if (incoming.get(4)) {
        struct.owner = iprot.readString();
        struct.setOwnerIsSet(true);
      }
      if (incoming.get(5)) {
        struct.application = iprot.readString();
        struct.setApplicationIsSet(true);
      }
      if (incoming.get(6)) {
        struct.computeResource = iprot.readString();
        struct.setComputeResourceIsSet(true);
      }
      if (incoming.get(7)) {
        struct.jobName = iprot.readString();
        struct.setJobNameIsSet(true);
      }
      if (incoming.get(8)) {
        struct.jobId = iprot.readString();
        struct.setJobIdIsSet(true);
      }
      if (incoming.get(9)) {
        struct.jobStatus = iprot.readString();
        struct.setJobStatusIsSet(true);
      }
      if (incoming.get(10)) {
        struct.jobCreationTime = iprot.readString();
        struct.setJobCreationTimeIsSet(true);
      }
      if (incoming.get(11)) {
        struct.notificationsTo = iprot.readString();
        struct.setNotificationsToIsSet(true);
      }
      if (incoming.get(12)) {
        struct.workingDir = iprot.readString();
        struct.setWorkingDirIsSet(true);
      }
      if (incoming.get(13)) {
        struct.jobDescription = iprot.readString();
        struct.setJobDescriptionIsSet(true);
      }
      if (incoming.get(14)) {
        struct.creationTime = iprot.readString();
        struct.setCreationTimeIsSet(true);
      }
      if (incoming.get(15)) {
        struct.lastModifiedTime = iprot.readString();
        struct.setLastModifiedTimeIsSet(true);
      }
      if (incoming.get(16)) {
        struct.wallTime = iprot.readString();
        struct.setWallTimeIsSet(true);
      }
      if (incoming.get(17)) {
        struct.cpuCount = iprot.readString();
        struct.setCpuCountIsSet(true);
      }
      if (incoming.get(18)) {
        struct.nodeCount = iprot.readString();
        struct.setNodeCountIsSet(true);
      }
      if (incoming.get(19)) {
        struct.queue = iprot.readString();
        struct.setQueueIsSet(true);
      }
      if (incoming.get(20)) {
        struct.inputs = iprot.readString();
        struct.setInputsIsSet(true);
      }
      if (incoming.get(21)) {
        struct.outputs = iprot.readString();
        struct.setOutputsIsSet(true);
      }
      if (incoming.get(22)) {
        struct.storageDir = iprot.readString();
        struct.setStorageDirIsSet(true);
      }
      if (incoming.get(23)) {
        struct.errors = iprot.readString();
        struct.setErrorsIsSet(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();
  }
}

