airavata-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "ASF GitHub Bot (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (AIRAVATA-2554) Admin dashboard customization
Date Sat, 04 Nov 2017 00:37:01 GMT

    [ https://issues.apache.org/jira/browse/AIRAVATA-2554?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16238642#comment-16238642 ] 

ASF GitHub Bot commented on AIRAVATA-2554:
------------------------------------------

smarru closed pull request #130: [AIRAVATA-2554] Admin dashboard customization
URL: https://github.com/apache/airavata/pull/130
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/User/Types.php b/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/User/Types.php
index cef4420555..2e7e0edc3b 100644
--- a/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/User/Types.php
+++ b/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/User/Types.php
@@ -2,7 +2,7 @@
 namespace Airavata\Model\User;
 
 /**
- * Autogenerated by Thrift Compiler (0.10.0)
+ * Autogenerated by Thrift Compiler (1.0.0-dev)
  *
  * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
  *  @generated
@@ -128,7 +128,52 @@
  * 
  */
 class NSFDemographics {
-  static $_TSPEC;
+  static $isValidate = false;
+
+  static $_TSPEC = array(
+    1 => array(
+      'var' => 'airavataInternalUserId',
+      'isRequired' => true,
+      'type' => TType::STRING,
+      ),
+    2 => array(
+      'var' => 'gender',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    3 => array(
+      'var' => 'usCitizenship',
+      'isRequired' => false,
+      'type' => TType::I32,
+      ),
+    4 => array(
+      'var' => 'ethnicities',
+      'isRequired' => false,
+      'type' => TType::LST,
+      'etype' => TType::I32,
+      'elem' => array(
+        'type' => TType::I32,
+        ),
+      ),
+    5 => array(
+      'var' => 'races',
+      'isRequired' => false,
+      'type' => TType::LST,
+      'etype' => TType::I32,
+      'elem' => array(
+        'type' => TType::I32,
+        ),
+      ),
+    6 => array(
+      'var' => 'disabilities',
+      'isRequired' => false,
+      'type' => TType::LST,
+      'etype' => TType::I32,
+      'elem' => array(
+        'type' => TType::I32,
+        ),
+      ),
+    );
 
   /**
    * @var string
@@ -156,46 +201,6 @@ class NSFDemographics {
   public $disabilities = null;
 
   public function __construct($vals=null) {
-    if (!isset(self::$_TSPEC)) {
-      self::$_TSPEC = array(
-        1 => array(
-          'var' => 'airavataInternalUserId',
-          'type' => TType::STRING,
-          ),
-        2 => array(
-          'var' => 'gender',
-          'type' => TType::STRING,
-          ),
-        3 => array(
-          'var' => 'usCitizenship',
-          'type' => TType::I32,
-          ),
-        4 => array(
-          'var' => 'ethnicities',
-          'type' => TType::LST,
-          'etype' => TType::I32,
-          'elem' => array(
-            'type' => TType::I32,
-            ),
-          ),
-        5 => array(
-          'var' => 'races',
-          'type' => TType::LST,
-          'etype' => TType::I32,
-          'elem' => array(
-            'type' => TType::I32,
-            ),
-          ),
-        6 => array(
-          'var' => 'disabilities',
-          'type' => TType::LST,
-          'etype' => TType::I32,
-          'elem' => array(
-            'type' => TType::I32,
-            ),
-          ),
-        );
-    }
     if (is_array($vals)) {
       if (isset($vals['airavataInternalUserId'])) {
         $this->airavataInternalUserId = $vals['airavataInternalUserId'];
@@ -396,6 +401,662 @@ public function write($output) {
 }
 
 /**
+ * A structure holding the cutomized admin dashboard information.
+ * 
+ * 
+ */
+class CustomDashboard {
+  static $isValidate = false;
+
+  static $_TSPEC = array(
+    1 => array(
+      'var' => 'airavataInternalUserId',
+      'isRequired' => true,
+      'type' => TType::STRING,
+      ),
+    2 => array(
+      'var' => 'experimentId',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    3 => array(
+      'var' => 'name',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    4 => array(
+      'var' => 'description',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    5 => array(
+      'var' => 'project',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    6 => array(
+      'var' => 'owner',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    7 => array(
+      'var' => 'application',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    8 => array(
+      'var' => 'computeResource',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    9 => array(
+      'var' => 'jobName',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    10 => array(
+      'var' => 'jobId',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    11 => array(
+      'var' => 'jobStatus',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    12 => array(
+      'var' => 'jobCreationTime',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    13 => array(
+      'var' => 'notificationsTo',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    14 => array(
+      'var' => 'workingDir',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    15 => array(
+      'var' => 'jobDescription',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    16 => array(
+      'var' => 'creationTime',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    17 => array(
+      'var' => 'lastModifiedTime',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    18 => array(
+      'var' => 'wallTime',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    19 => array(
+      'var' => 'cpuCount',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    20 => array(
+      'var' => 'nodeCount',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    21 => array(
+      'var' => 'queue',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    22 => array(
+      'var' => 'inputs',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    23 => array(
+      'var' => 'outputs',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    24 => array(
+      'var' => 'storageDir',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    25 => array(
+      'var' => 'errors',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    );
+
+  /**
+   * @var string
+   */
+  public $airavataInternalUserId = "DO_NOT_SET_AT_CLIENTS";
+  /**
+   * @var string
+   */
+  public $experimentId = null;
+  /**
+   * @var string
+   */
+  public $name = null;
+  /**
+   * @var string
+   */
+  public $description = null;
+  /**
+   * @var string
+   */
+  public $project = null;
+  /**
+   * @var string
+   */
+  public $owner = null;
+  /**
+   * @var string
+   */
+  public $application = null;
+  /**
+   * @var string
+   */
+  public $computeResource = null;
+  /**
+   * @var string
+   */
+  public $jobName = null;
+  /**
+   * @var string
+   */
+  public $jobId = null;
+  /**
+   * @var string
+   */
+  public $jobStatus = null;
+  /**
+   * @var string
+   */
+  public $jobCreationTime = null;
+  /**
+   * @var string
+   */
+  public $notificationsTo = null;
+  /**
+   * @var string
+   */
+  public $workingDir = null;
+  /**
+   * @var string
+   */
+  public $jobDescription = null;
+  /**
+   * @var string
+   */
+  public $creationTime = null;
+  /**
+   * @var string
+   */
+  public $lastModifiedTime = null;
+  /**
+   * @var string
+   */
+  public $wallTime = null;
+  /**
+   * @var string
+   */
+  public $cpuCount = null;
+  /**
+   * @var string
+   */
+  public $nodeCount = null;
+  /**
+   * @var string
+   */
+  public $queue = null;
+  /**
+   * @var string
+   */
+  public $inputs = null;
+  /**
+   * @var string
+   */
+  public $outputs = null;
+  /**
+   * @var string
+   */
+  public $storageDir = null;
+  /**
+   * @var string
+   */
+  public $errors = null;
+
+  public function __construct($vals=null) {
+    if (is_array($vals)) {
+      if (isset($vals['airavataInternalUserId'])) {
+        $this->airavataInternalUserId = $vals['airavataInternalUserId'];
+      }
+      if (isset($vals['experimentId'])) {
+        $this->experimentId = $vals['experimentId'];
+      }
+      if (isset($vals['name'])) {
+        $this->name = $vals['name'];
+      }
+      if (isset($vals['description'])) {
+        $this->description = $vals['description'];
+      }
+      if (isset($vals['project'])) {
+        $this->project = $vals['project'];
+      }
+      if (isset($vals['owner'])) {
+        $this->owner = $vals['owner'];
+      }
+      if (isset($vals['application'])) {
+        $this->application = $vals['application'];
+      }
+      if (isset($vals['computeResource'])) {
+        $this->computeResource = $vals['computeResource'];
+      }
+      if (isset($vals['jobName'])) {
+        $this->jobName = $vals['jobName'];
+      }
+      if (isset($vals['jobId'])) {
+        $this->jobId = $vals['jobId'];
+      }
+      if (isset($vals['jobStatus'])) {
+        $this->jobStatus = $vals['jobStatus'];
+      }
+      if (isset($vals['jobCreationTime'])) {
+        $this->jobCreationTime = $vals['jobCreationTime'];
+      }
+      if (isset($vals['notificationsTo'])) {
+        $this->notificationsTo = $vals['notificationsTo'];
+      }
+      if (isset($vals['workingDir'])) {
+        $this->workingDir = $vals['workingDir'];
+      }
+      if (isset($vals['jobDescription'])) {
+        $this->jobDescription = $vals['jobDescription'];
+      }
+      if (isset($vals['creationTime'])) {
+        $this->creationTime = $vals['creationTime'];
+      }
+      if (isset($vals['lastModifiedTime'])) {
+        $this->lastModifiedTime = $vals['lastModifiedTime'];
+      }
+      if (isset($vals['wallTime'])) {
+        $this->wallTime = $vals['wallTime'];
+      }
+      if (isset($vals['cpuCount'])) {
+        $this->cpuCount = $vals['cpuCount'];
+      }
+      if (isset($vals['nodeCount'])) {
+        $this->nodeCount = $vals['nodeCount'];
+      }
+      if (isset($vals['queue'])) {
+        $this->queue = $vals['queue'];
+      }
+      if (isset($vals['inputs'])) {
+        $this->inputs = $vals['inputs'];
+      }
+      if (isset($vals['outputs'])) {
+        $this->outputs = $vals['outputs'];
+      }
+      if (isset($vals['storageDir'])) {
+        $this->storageDir = $vals['storageDir'];
+      }
+      if (isset($vals['errors'])) {
+        $this->errors = $vals['errors'];
+      }
+    }
+  }
+
+  public function getName() {
+    return 'CustomDashboard';
+  }
+
+  public function read($input)
+  {
+    $xfer = 0;
+    $fname = null;
+    $ftype = 0;
+    $fid = 0;
+    $xfer += $input->readStructBegin($fname);
+    while (true)
+    {
+      $xfer += $input->readFieldBegin($fname, $ftype, $fid);
+      if ($ftype == TType::STOP) {
+        break;
+      }
+      switch ($fid)
+      {
+        case 1:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->airavataInternalUserId);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 2:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->experimentId);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 3:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->name);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 4:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->description);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 5:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->project);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 6:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->owner);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 7:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->application);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 8:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->computeResource);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 9:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->jobName);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 10:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->jobId);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 11:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->jobStatus);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 12:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->jobCreationTime);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 13:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->notificationsTo);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 14:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->workingDir);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 15:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->jobDescription);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 16:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->creationTime);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 17:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->lastModifiedTime);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 18:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->wallTime);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 19:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->cpuCount);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 20:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->nodeCount);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 21:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->queue);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 22:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->inputs);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 23:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->outputs);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 24:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->storageDir);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 25:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->errors);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        default:
+          $xfer += $input->skip($ftype);
+          break;
+      }
+      $xfer += $input->readFieldEnd();
+    }
+    $xfer += $input->readStructEnd();
+    return $xfer;
+  }
+
+  public function write($output) {
+    $xfer = 0;
+    $xfer += $output->writeStructBegin('CustomDashboard');
+    if ($this->airavataInternalUserId !== null) {
+      $xfer += $output->writeFieldBegin('airavataInternalUserId', TType::STRING, 1);
+      $xfer += $output->writeString($this->airavataInternalUserId);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->experimentId !== null) {
+      $xfer += $output->writeFieldBegin('experimentId', TType::STRING, 2);
+      $xfer += $output->writeString($this->experimentId);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->name !== null) {
+      $xfer += $output->writeFieldBegin('name', TType::STRING, 3);
+      $xfer += $output->writeString($this->name);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->description !== null) {
+      $xfer += $output->writeFieldBegin('description', TType::STRING, 4);
+      $xfer += $output->writeString($this->description);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->project !== null) {
+      $xfer += $output->writeFieldBegin('project', TType::STRING, 5);
+      $xfer += $output->writeString($this->project);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->owner !== null) {
+      $xfer += $output->writeFieldBegin('owner', TType::STRING, 6);
+      $xfer += $output->writeString($this->owner);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->application !== null) {
+      $xfer += $output->writeFieldBegin('application', TType::STRING, 7);
+      $xfer += $output->writeString($this->application);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->computeResource !== null) {
+      $xfer += $output->writeFieldBegin('computeResource', TType::STRING, 8);
+      $xfer += $output->writeString($this->computeResource);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->jobName !== null) {
+      $xfer += $output->writeFieldBegin('jobName', TType::STRING, 9);
+      $xfer += $output->writeString($this->jobName);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->jobId !== null) {
+      $xfer += $output->writeFieldBegin('jobId', TType::STRING, 10);
+      $xfer += $output->writeString($this->jobId);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->jobStatus !== null) {
+      $xfer += $output->writeFieldBegin('jobStatus', TType::STRING, 11);
+      $xfer += $output->writeString($this->jobStatus);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->jobCreationTime !== null) {
+      $xfer += $output->writeFieldBegin('jobCreationTime', TType::STRING, 12);
+      $xfer += $output->writeString($this->jobCreationTime);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->notificationsTo !== null) {
+      $xfer += $output->writeFieldBegin('notificationsTo', TType::STRING, 13);
+      $xfer += $output->writeString($this->notificationsTo);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->workingDir !== null) {
+      $xfer += $output->writeFieldBegin('workingDir', TType::STRING, 14);
+      $xfer += $output->writeString($this->workingDir);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->jobDescription !== null) {
+      $xfer += $output->writeFieldBegin('jobDescription', TType::STRING, 15);
+      $xfer += $output->writeString($this->jobDescription);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->creationTime !== null) {
+      $xfer += $output->writeFieldBegin('creationTime', TType::STRING, 16);
+      $xfer += $output->writeString($this->creationTime);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->lastModifiedTime !== null) {
+      $xfer += $output->writeFieldBegin('lastModifiedTime', TType::STRING, 17);
+      $xfer += $output->writeString($this->lastModifiedTime);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->wallTime !== null) {
+      $xfer += $output->writeFieldBegin('wallTime', TType::STRING, 18);
+      $xfer += $output->writeString($this->wallTime);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->cpuCount !== null) {
+      $xfer += $output->writeFieldBegin('cpuCount', TType::STRING, 19);
+      $xfer += $output->writeString($this->cpuCount);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->nodeCount !== null) {
+      $xfer += $output->writeFieldBegin('nodeCount', TType::STRING, 20);
+      $xfer += $output->writeString($this->nodeCount);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->queue !== null) {
+      $xfer += $output->writeFieldBegin('queue', TType::STRING, 21);
+      $xfer += $output->writeString($this->queue);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->inputs !== null) {
+      $xfer += $output->writeFieldBegin('inputs', TType::STRING, 22);
+      $xfer += $output->writeString($this->inputs);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->outputs !== null) {
+      $xfer += $output->writeFieldBegin('outputs', TType::STRING, 23);
+      $xfer += $output->writeString($this->outputs);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->storageDir !== null) {
+      $xfer += $output->writeFieldBegin('storageDir', TType::STRING, 24);
+      $xfer += $output->writeString($this->storageDir);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->errors !== null) {
+      $xfer += $output->writeFieldBegin('errors', TType::STRING, 25);
+      $xfer += $output->writeString($this->errors);
+      $xfer += $output->writeFieldEnd();
+    }
+    $xfer += $output->writeFieldStop();
+    $xfer += $output->writeStructEnd();
+    return $xfer;
+  }
+
+}
+
+/**
  * * A structure holding the user profile and its child models.
  * *
  * * Notes:
@@ -454,7 +1115,158 @@ public function write($output) {
  * *
  */
 class UserProfile {
-  static $_TSPEC;
+  static $isValidate = false;
+
+  static $_TSPEC = array(
+    1 => array(
+      'var' => 'userModelVersion',
+      'isRequired' => true,
+      'type' => TType::STRING,
+      ),
+    2 => array(
+      'var' => 'airavataInternalUserId',
+      'isRequired' => true,
+      'type' => TType::STRING,
+      ),
+    3 => array(
+      'var' => 'userId',
+      'isRequired' => true,
+      'type' => TType::STRING,
+      ),
+    4 => array(
+      'var' => 'gatewayId',
+      'isRequired' => true,
+      'type' => TType::STRING,
+      ),
+    5 => array(
+      'var' => 'emails',
+      'isRequired' => true,
+      'type' => TType::LST,
+      'etype' => TType::STRING,
+      'elem' => array(
+        'type' => TType::STRING,
+        ),
+      ),
+    6 => array(
+      'var' => 'firstName',
+      'isRequired' => true,
+      'type' => TType::STRING,
+      ),
+    7 => array(
+      'var' => 'lastName',
+      'isRequired' => true,
+      'type' => TType::STRING,
+      ),
+    8 => array(
+      'var' => 'middleName',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    9 => array(
+      'var' => 'namePrefix',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    10 => array(
+      'var' => 'nameSuffix',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    11 => array(
+      'var' => 'orcidId',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    12 => array(
+      'var' => 'phones',
+      'isRequired' => false,
+      'type' => TType::LST,
+      'etype' => TType::STRING,
+      'elem' => array(
+        'type' => TType::STRING,
+        ),
+      ),
+    13 => array(
+      'var' => 'country',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    14 => array(
+      'var' => 'nationality',
+      'isRequired' => false,
+      'type' => TType::LST,
+      'etype' => TType::STRING,
+      'elem' => array(
+        'type' => TType::STRING,
+        ),
+      ),
+    15 => array(
+      'var' => 'homeOrganization',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    16 => array(
+      'var' => 'orginationAffiliation',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    17 => array(
+      'var' => 'creationTime',
+      'isRequired' => true,
+      'type' => TType::I64,
+      ),
+    18 => array(
+      'var' => 'lastAccessTime',
+      'isRequired' => true,
+      'type' => TType::I64,
+      ),
+    19 => array(
+      'var' => 'validUntil',
+      'isRequired' => true,
+      'type' => TType::I64,
+      ),
+    20 => array(
+      'var' => 'State',
+      'isRequired' => true,
+      'type' => TType::I32,
+      ),
+    21 => array(
+      'var' => 'comments',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    22 => array(
+      'var' => 'labeledURI',
+      'isRequired' => false,
+      'type' => TType::LST,
+      'etype' => TType::STRING,
+      'elem' => array(
+        'type' => TType::STRING,
+        ),
+      ),
+    23 => array(
+      'var' => 'gpgKey',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    24 => array(
+      'var' => 'timeZone',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    25 => array(
+      'var' => 'nsfDemographics',
+      'isRequired' => false,
+      'type' => TType::STRUCT,
+      'class' => '\Airavata\Model\User\NSFDemographics',
+      ),
+    26 => array(
+      'var' => 'customDashboard',
+      'isRequired' => false,
+      'type' => TType::STRUCT,
+      'class' => '\Airavata\Model\User\CustomDashboard',
+      ),
+    );
 
   /**
    * @var string
@@ -556,129 +1368,12 @@ class UserProfile {
    * @var \Airavata\Model\User\NSFDemographics
    */
   public $nsfDemographics = null;
+  /**
+   * @var \Airavata\Model\User\CustomDashboard
+   */
+  public $customDashboard = null;
 
   public function __construct($vals=null) {
-    if (!isset(self::$_TSPEC)) {
-      self::$_TSPEC = array(
-        1 => array(
-          'var' => 'userModelVersion',
-          'type' => TType::STRING,
-          ),
-        2 => array(
-          'var' => 'airavataInternalUserId',
-          'type' => TType::STRING,
-          ),
-        3 => array(
-          'var' => 'userId',
-          'type' => TType::STRING,
-          ),
-        4 => array(
-          'var' => 'gatewayId',
-          'type' => TType::STRING,
-          ),
-        5 => array(
-          'var' => 'emails',
-          'type' => TType::LST,
-          'etype' => TType::STRING,
-          'elem' => array(
-            'type' => TType::STRING,
-            ),
-          ),
-        6 => array(
-          'var' => 'firstName',
-          'type' => TType::STRING,
-          ),
-        7 => array(
-          'var' => 'lastName',
-          'type' => TType::STRING,
-          ),
-        8 => array(
-          'var' => 'middleName',
-          'type' => TType::STRING,
-          ),
-        9 => array(
-          'var' => 'namePrefix',
-          'type' => TType::STRING,
-          ),
-        10 => array(
-          'var' => 'nameSuffix',
-          'type' => TType::STRING,
-          ),
-        11 => array(
-          'var' => 'orcidId',
-          'type' => TType::STRING,
-          ),
-        12 => array(
-          'var' => 'phones',
-          'type' => TType::LST,
-          'etype' => TType::STRING,
-          'elem' => array(
-            'type' => TType::STRING,
-            ),
-          ),
-        13 => array(
-          'var' => 'country',
-          'type' => TType::STRING,
-          ),
-        14 => array(
-          'var' => 'nationality',
-          'type' => TType::LST,
-          'etype' => TType::STRING,
-          'elem' => array(
-            'type' => TType::STRING,
-            ),
-          ),
-        15 => array(
-          'var' => 'homeOrganization',
-          'type' => TType::STRING,
-          ),
-        16 => array(
-          'var' => 'orginationAffiliation',
-          'type' => TType::STRING,
-          ),
-        17 => array(
-          'var' => 'creationTime',
-          'type' => TType::I64,
-          ),
-        18 => array(
-          'var' => 'lastAccessTime',
-          'type' => TType::I64,
-          ),
-        19 => array(
-          'var' => 'validUntil',
-          'type' => TType::I64,
-          ),
-        20 => array(
-          'var' => 'State',
-          'type' => TType::I32,
-          ),
-        21 => array(
-          'var' => 'comments',
-          'type' => TType::STRING,
-          ),
-        22 => array(
-          'var' => 'labeledURI',
-          'type' => TType::LST,
-          'etype' => TType::STRING,
-          'elem' => array(
-            'type' => TType::STRING,
-            ),
-          ),
-        23 => array(
-          'var' => 'gpgKey',
-          'type' => TType::STRING,
-          ),
-        24 => array(
-          'var' => 'timeZone',
-          'type' => TType::STRING,
-          ),
-        25 => array(
-          'var' => 'nsfDemographics',
-          'type' => TType::STRUCT,
-          'class' => '\Airavata\Model\User\NSFDemographics',
-          ),
-        );
-    }
     if (is_array($vals)) {
       if (isset($vals['userModelVersion'])) {
         $this->userModelVersion = $vals['userModelVersion'];
@@ -755,6 +1450,9 @@ public function __construct($vals=null) {
       if (isset($vals['nsfDemographics'])) {
         $this->nsfDemographics = $vals['nsfDemographics'];
       }
+      if (isset($vals['customDashboard'])) {
+        $this->customDashboard = $vals['customDashboard'];
+      }
     }
   }
 
@@ -993,6 +1691,14 @@ public function read($input)
             $xfer += $input->skip($ftype);
           }
           break;
+        case 26:
+          if ($ftype == TType::STRUCT) {
+            $this->customDashboard = new \Airavata\Model\User\CustomDashboard();
+            $xfer += $this->customDashboard->read($input);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
         default:
           $xfer += $input->skip($ftype);
           break;
@@ -1182,6 +1888,14 @@ public function write($output) {
       $xfer += $this->nsfDemographics->write($output);
       $xfer += $output->writeFieldEnd();
     }
+    if ($this->customDashboard !== null) {
+      if (!is_object($this->customDashboard)) {
+        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
+      }
+      $xfer += $output->writeFieldBegin('customDashboard', TType::STRUCT, 26);
+      $xfer += $this->customDashboard->write($output);
+      $xfer += $output->writeFieldEnd();
+    }
     $xfer += $output->writeFieldStop();
     $xfer += $output->writeStructEnd();
     return $xfer;
diff --git a/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Service/Profile/User/CPI/UserProfileService.php b/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Service/Profile/User/CPI/UserProfileService.php
index 0efa67ed3b..1c659be491 100644
--- a/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Service/Profile/User/CPI/UserProfileService.php
+++ b/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Service/Profile/User/CPI/UserProfileService.php
@@ -1,7 +1,7 @@
 <?php
 namespace Airavata\Service\Profile\User\CPI;
 /**
- * Autogenerated by Thrift Compiler (0.10.0)
+ * Autogenerated by Thrift Compiler (1.0.0-dev)
  *
  * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
  *  @generated
@@ -499,7 +499,22 @@ public function recv_doesUserExist()
 // HELPER FUNCTIONS AND STRUCTURES
 
 class UserProfileService_addUserProfile_args {
-  static $_TSPEC;
+  static $isValidate = false;
+
+  static $_TSPEC = array(
+    1 => array(
+      'var' => 'authzToken',
+      'isRequired' => true,
+      'type' => TType::STRUCT,
+      'class' => '\Airavata\Model\Security\AuthzToken',
+      ),
+    2 => array(
+      'var' => 'userProfile',
+      'isRequired' => true,
+      'type' => TType::STRUCT,
+      'class' => '\Airavata\Model\User\UserProfile',
+      ),
+    );
 
   /**
    * @var \Airavata\Model\Security\AuthzToken
@@ -511,20 +526,6 @@ class UserProfileService_addUserProfile_args {
   public $userProfile = null;
 
   public function __construct($vals=null) {
-    if (!isset(self::$_TSPEC)) {
-      self::$_TSPEC = array(
-        1 => array(
-          'var' => 'authzToken',
-          'type' => TType::STRUCT,
-          'class' => '\Airavata\Model\Security\AuthzToken',
-          ),
-        2 => array(
-          'var' => 'userProfile',
-          'type' => TType::STRUCT,
-          'class' => '\Airavata\Model\User\UserProfile',
-          ),
-        );
-    }
     if (is_array($vals)) {
       if (isset($vals['authzToken'])) {
         $this->authzToken = $vals['authzToken'];
@@ -607,7 +608,27 @@ public function write($output) {
 }
 
 class UserProfileService_addUserProfile_result {
-  static $_TSPEC;
+  static $isValidate = false;
+
+  static $_TSPEC = array(
+    0 => array(
+      'var' => 'success',
+      'isRequired' => false,
+      'type' => TType::STRING,
+      ),
+    1 => array(
+      'var' => 'upe',
+      'isRequired' => false,
+      'type' => TType::STRUCT,
+      'class' => '\Airavata\Service\Profile\User\CPI\Error\UserProfileServiceException',
+      ),
+    2 => array(
+      'var' => 'ae',
+      'isRequired' => false,
+      'type' => TType::STRUCT,
+      'class' => '\Airavata\API\Error\AuthorizationException',
+      ),
+    );
 
   /**
    * @var string
@@ -623,24 +644,6 @@ class UserProfileService_addUserProfile_result {
   public $ae = null;
 
   public function __construct($vals=null) {
-    if (!isset(self::$_TSPEC)) {
-      self::$_TSPEC = array(
-        0 => array(
-          'var' => 'success',
-          'type' => TType::STRING,
-          ),
-        1 => array(
-          'var' => 'upe',
-          'type' => TType::STRUCT,
-          'class' => '\Airavata\Service\Profile\User\CPI\Error\UserProfileServiceException',
-          ),
-        2 => array(
-          'var' => 'ae',
-          'type' => TType::STRUCT,
-          'class' => '\Airavata\API\Error\AuthorizationException',
-          ),
-        );
-    }
     if (is_array($vals)) {
       if (isset($vals['success'])) {
         $this->success = $vals['success'];
@@ -732,7 +735,22 @@ public function write($output) {
 }
 
 class UserProfileService_updateUserProfile_args {
-  static $_TSPEC;
+  static $isValidate = false;
+
+  static $_TSPEC = array(
+    1 => array(
+      'var' => 'authzToken',
+      'isRequired' => true,
+      'type' => TType::STRUCT,
+      'class' => '\Airavata\Model\Security\AuthzToken',
+      ),
+    2 => array(
+      'var' => 'userProfile',
+      'isRequired' => true,
+      'type' => TType::STRUCT,
+      'class' => '\Airavata\Model\User\UserProfile',
+      ),
+    );
 
   /**
    * @var \Airavata\Model\Security\AuthzToken
@@ -744,20 +762,6 @@ class UserProfileService_updateUserProfile_args {
   public $userProfile = null;
 
   public function __construct($vals=null) {
-    if (!isset(self::$_TSPEC)) {
-      self::$_TSPEC = array(
-        1 => array(
-          'var' => 'authzToken',
-          'type' => TType::STRUCT,
-          'class' => '\Airavata\Model\Security\AuthzToken',
-          ),
-        2 => array(
-          'var' => 'userProfile',
-          'type' => TType::STRUCT,
-          'class' => '\Airavata\Model\User\UserProfile',
-          ),
-        );
-    }
     if (is_array($vals)) {
       if (isset($vals['authzToken'])) {
         $this->authzToken = $vals['authzToken'];
@@ -840,7 +844,27 @@ public function write($output) {
 }
 
 class UserProfileService_updateUserProfile_result {
-  static $_TSPEC;
+  static $isValidate = false;
+
+  static $_TSPEC = array(
+    0 => array(
+      'var' => 'success',
+      'isRequired' => false,
+      'type' => TType::BOOL,
+      ),
+    1 => array(
+      'var' => 'upe',
+      'isRequired' => false,
+      'type' => TType::STRUCT,
+      'class' => '\Airavata\Service\Profile\User\CPI\Error\UserProfileServiceException',
+      ),
+    2 => array(
+      'var' => 'ae',
+      'isRequired' => false,
+      'type' => TType::STRUCT,
+      'class' => '\Airavata\API\Error\AuthorizationException',
+      ),
+    );
 
   /**
    * @var bool
@@ -856,24 +880,6 @@ class UserProfileService_updateUserProfile_result {
   public $ae = null;
 
   public function __construct($vals=null) {
-    if (!isset(self::$_TSPEC)) {
-      self::$_TSPEC = array(
-        0 => array(
-          'var' => 'success',
-          'type' => TType::BOOL,
-          ),
-        1 => array(
-          'var' => 'upe',
-          'type' => TType::STRUCT,
-          'class' => '\Airavata\Service\Profile\User\CPI\Error\UserProfileServiceException',
-          ),
-        2 => array(
-          'var' => 'ae',
-          'type' => TType::STRUCT,
-          'class' => '\Airavata\API\Error\AuthorizationException',
-          ),
-        );
-    }
     if (is_array($vals)) {
       if (isset($vals['success'])) {
         $this->success = $vals['success'];
@@ -965,7 +971,26 @@ public function write($output) {
 }
 
 class UserProfileService_getUserProfileById_args {
-  static $_TSPEC;
+  static $isValidate = false;
+
+  static $_TSPEC = array(
+    1 => array(
+      'var' => 'authzToken',
+      'isRequired' => true,
+      'type' => TType::STRUCT,
+      'class' => '\Airavata\Model\Security\AuthzToken',
+      ),
+    2 => array(
+      'var' => 'userId',
+      'isRequired' => true,
+      'type' => TType::STRING,
+      ),
+    3 => array(
+      'var' => 'gatewayId',
+      'isRequired' => true,
+      'type' => TType::STRING,
+      ),
+    );
 
   /**
    * @var \Airavata\Model\Security\AuthzToken
@@ -981,23 +1006,6 @@ class UserProfileService_getUserProfileById_args {
   public $gatewayId = null;
 
   public function __construct($vals=null) {
-    if (!isset(self::$_TSPEC)) {
-      self::$_TSPEC = array(
-        1 => array(
-          'var' => 'authzToken',
-          'type' => TType::STRUCT,
-          'class' => '\Airavata\Model\Security\AuthzToken',
-          ),
-        2 => array(
-          'var' => 'userId',
-          'type' => TType::STRING,
-          ),
-        3 => array(
-          'var' => 'gatewayId',
-          'type' => TType::STRING,
-          ),
-        );
-    }
     if (is_array($vals)) {
       if (isset($vals['authzToken'])) {
         $this->authzToken = $vals['authzToken'];
@@ -1091,7 +1099,28 @@ public function write($output) {
 }
 
 class UserProfileService_getUserProfileById_result {
-  static $_TSPEC;
+  static $isValidate = false;
+
+  static $_TSPEC = array(
+    0 => array(
+      'var' => 'success',
+      'isRequired' => false,
+      'type' => TType::STRUCT,
+      'class' => '\Airavata\Model\User\UserProfile',
+      ),
+    1 => array(
+      'var' => 'upe',
+      'isRequired' => false,
+      'type' => TType::STRUCT,
+      'class' => '\Airavata\Service\Profile\User\CPI\Error\UserProfileServiceException',
+      ),
+    2 => array(
+      'var' => 'ae',
+      'isRequired' => false,
+      'type' => TType::STRUCT,
+      'class' => '\Airavata\API\Error\AuthorizationException',
+      ),
+    );
 
   /**
    * @var \Airavata\Model\User\UserProfile
@@ -1107,25 +1136,6 @@ class UserProfileService_getUserProfileById_result {
   public $ae = null;
 
   public function __construct($vals=null) {
-    if (!isset(self::$_TSPEC)) {
-      self::$_TSPEC = array(
-        0 => array(
-          'var' => 'success',
-          'type' => TType::STRUCT,
-          'class' => '\Airavata\Model\User\UserProfile',
-          ),
-        1 => array(
-          'var' => 'upe',
-          'type' => TType::STRUCT,
-          'class' => '\Airavata\Service\Profile\User\CPI\Error\UserProfileServiceException',
-          ),
-        2 => array(
-          'var' => 'ae',
-          'type' => TType::STRUCT,
-          'class' => '\Airavata\API\Error\AuthorizationException',
-          ),
-        );
-    }
     if (is_array($vals)) {
       if (isset($vals['success'])) {
         $this->success = $vals['success'];
@@ -1221,7 +1231,26 @@ public function write($output) {
 }
 
 class UserProfileService_deleteUserProfile_args {
-  static $_TSPEC;
+  static $isValidate = false;
+
+  static $_TSPEC = array(
+    1 => array(
+      'var' => 'authzToken',
+      'isRequired' => true,
+      'type' => TType::STRUCT,
+      'class' => '\Airavata\Model\Security\AuthzToken',
+      ),
+    2 => array(
+      'var' => 'userId',
+      'isRequired' => true,
+      'type' => TType::STRING,
+      ),
+    3 => array(
+      'var' => 'gatewayId',
+      'isRequired' => true,
+      'type' => TType::STRING,
+      ),
+    );
 
   /**
    * @var \Airavata\Model\Security\AuthzToken
@@ -1237,23 +1266,6 @@ class UserProfileService_deleteUserProfile_args {
   public $gatewayId = null;
 
   public function __construct($vals=null) {
-    if (!isset(self::$_TSPEC)) {
-      self::$_TSPEC = array(
-        1 => array(
-          'var' => 'authzToken',
-          'type' => TType::STRUCT,
-          'class' => '\Airavata\Model\Security\AuthzToken',
-          ),
-        2 => array(
-          'var' => 'userId',
-          'type' => TType::STRING,
-          ),
-        3 => array(
-          'var' => 'gatewayId',
-          'type' => TType::STRING,
-          ),
-        );
-    }
     if (is_array($vals)) {
       if (isset($vals['authzToken'])) {
         $this->authzToken = $vals['authzToken'];
@@ -1347,7 +1359,27 @@ public function write($output) {
 }
 
 class UserProfileService_deleteUserProfile_result {
-  static $_TSPEC;
+  static $isValidate = false;
+
+  static $_TSPEC = array(
+    0 => array(
+      'var' => 'success',
+      'isRequired' => false,
+      'type' => TType::BOOL,
+      ),
+    1 => array(
+      'var' => 'upe',
+      'isRequired' => false,
+      'type' => TType::STRUCT,
+      'class' => '\Airavata\Service\Profile\User\CPI\Error\UserProfileServiceException',
+      ),
+    2 => array(
+      'var' => 'ae',
+      'isRequired' => false,
+      'type' => TType::STRUCT,
+      'class' => '\Airavata\API\Error\AuthorizationException',
+      ),
+    );
 
   /**
    * @var bool
@@ -1363,24 +1395,6 @@ class UserProfileService_deleteUserProfile_result {
   public $ae = null;
 
   public function __construct($vals=null) {
-    if (!isset(self::$_TSPEC)) {
-      self::$_TSPEC = array(
-        0 => array(
-          'var' => 'success',
-          'type' => TType::BOOL,
-          ),
-        1 => array(
-          'var' => 'upe',
-          'type' => TType::STRUCT,
-          'class' => '\Airavata\Service\Profile\User\CPI\Error\UserProfileServiceException',
-          ),
-        2 => array(
-          'var' => 'ae',
-          'type' => TType::STRUCT,
-          'class' => '\Airavata\API\Error\AuthorizationException',
-          ),
-        );
-    }
     if (is_array($vals)) {
       if (isset($vals['success'])) {
         $this->success = $vals['success'];
@@ -1472,7 +1486,31 @@ public function write($output) {
 }
 
 class UserProfileService_getAllUserProfilesInGateway_args {
-  static $_TSPEC;
+  static $isValidate = false;
+
+  static $_TSPEC = array(
+    1 => array(
+      'var' => 'authzToken',
+      'isRequired' => true,
+      'type' => TType::STRUCT,
+      'class' => '\Airavata\Model\Security\AuthzToken',
+      ),
+    2 => array(
+      'var' => 'gatewayId',
+      'isRequired' => true,
+      'type' => TType::STRING,
+      ),
+    3 => array(
+      'var' => 'offset',
+      'isRequired' => true,
+      'type' => TType::I32,
+      ),
+    4 => array(
+      'var' => 'limit',
+      'isRequired' => true,
+      'type' => TType::I32,
+      ),
+    );
 
   /**
    * @var \Airavata\Model\Security\AuthzToken
@@ -1492,27 +1530,6 @@ class UserProfileService_getAllUserProfilesInGateway_args {
   public $limit = null;
 
   public function __construct($vals=null) {
-    if (!isset(self::$_TSPEC)) {
-      self::$_TSPEC = array(
-        1 => array(
-          'var' => 'authzToken',
-          'type' => TType::STRUCT,
-          'class' => '\Airavata\Model\Security\AuthzToken',
-          ),
-        2 => array(
-          'var' => 'gatewayId',
-          'type' => TType::STRING,
-          ),
-        3 => array(
-          'var' => 'offset',
-          'type' => TType::I32,
-          ),
-        4 => array(
-          'var' => 'limit',
-          'type' => TType::I32,
-          ),
-        );
-    }
     if (is_array($vals)) {
       if (isset($vals['authzToken'])) {
         $this->authzToken = $vals['authzToken'];
@@ -1621,7 +1638,32 @@ public function write($output) {
 }
 
 class UserProfileService_getAllUserProfilesInGateway_result {
-  static $_TSPEC;
+  static $isValidate = false;
+
+  static $_TSPEC = array(
+    0 => array(
+      'var' => 'success',
+      'isRequired' => false,
+      'type' => TType::LST,
+      'etype' => TType::STRUCT,
+      'elem' => array(
+        'type' => TType::STRUCT,
+        'class' => '\Airavata\Model\User\UserProfile',
+        ),
+      ),
+    1 => array(
+      'var' => 'upe',
+      'isRequired' => false,
+      'type' => TType::STRUCT,
+      'class' => '\Airavata\Service\Profile\User\CPI\Error\UserProfileServiceException',
+      ),
+    2 => array(
+      'var' => 'ae',
+      'isRequired' => false,
+      'type' => TType::STRUCT,
+      'class' => '\Airavata\API\Error\AuthorizationException',
+      ),
+    );
 
   /**
    * @var \Airavata\Model\User\UserProfile[]
@@ -1637,29 +1679,6 @@ class UserProfileService_getAllUserProfilesInGateway_result {
   public $ae = null;
 
   public function __construct($vals=null) {
-    if (!isset(self::$_TSPEC)) {
-      self::$_TSPEC = array(
-        0 => array(
-          'var' => 'success',
-          'type' => TType::LST,
-          'etype' => TType::STRUCT,
-          'elem' => array(
-            'type' => TType::STRUCT,
-            'class' => '\Airavata\Model\User\UserProfile',
-            ),
-          ),
-        1 => array(
-          'var' => 'upe',
-          'type' => TType::STRUCT,
-          'class' => '\Airavata\Service\Profile\User\CPI\Error\UserProfileServiceException',
-          ),
-        2 => array(
-          'var' => 'ae',
-          'type' => TType::STRUCT,
-          'class' => '\Airavata\API\Error\AuthorizationException',
-          ),
-        );
-    }
     if (is_array($vals)) {
       if (isset($vals['success'])) {
         $this->success = $vals['success'];
@@ -1774,7 +1793,26 @@ public function write($output) {
 }
 
 class UserProfileService_doesUserExist_args {
-  static $_TSPEC;
+  static $isValidate = false;
+
+  static $_TSPEC = array(
+    1 => array(
+      'var' => 'authzToken',
+      'isRequired' => true,
+      'type' => TType::STRUCT,
+      'class' => '\Airavata\Model\Security\AuthzToken',
+      ),
+    2 => array(
+      'var' => 'userId',
+      'isRequired' => true,
+      'type' => TType::STRING,
+      ),
+    3 => array(
+      'var' => 'gatewayId',
+      'isRequired' => true,
+      'type' => TType::STRING,
+      ),
+    );
 
   /**
    * @var \Airavata\Model\Security\AuthzToken
@@ -1790,23 +1828,6 @@ class UserProfileService_doesUserExist_args {
   public $gatewayId = null;
 
   public function __construct($vals=null) {
-    if (!isset(self::$_TSPEC)) {
-      self::$_TSPEC = array(
-        1 => array(
-          'var' => 'authzToken',
-          'type' => TType::STRUCT,
-          'class' => '\Airavata\Model\Security\AuthzToken',
-          ),
-        2 => array(
-          'var' => 'userId',
-          'type' => TType::STRING,
-          ),
-        3 => array(
-          'var' => 'gatewayId',
-          'type' => TType::STRING,
-          ),
-        );
-    }
     if (is_array($vals)) {
       if (isset($vals['authzToken'])) {
         $this->authzToken = $vals['authzToken'];
@@ -1900,7 +1921,27 @@ public function write($output) {
 }
 
 class UserProfileService_doesUserExist_result {
-  static $_TSPEC;
+  static $isValidate = false;
+
+  static $_TSPEC = array(
+    0 => array(
+      'var' => 'success',
+      'isRequired' => false,
+      'type' => TType::BOOL,
+      ),
+    1 => array(
+      'var' => 'upe',
+      'isRequired' => false,
+      'type' => TType::STRUCT,
+      'class' => '\Airavata\Service\Profile\User\CPI\Error\UserProfileServiceException',
+      ),
+    2 => array(
+      'var' => 'ae',
+      'isRequired' => false,
+      'type' => TType::STRUCT,
+      'class' => '\Airavata\API\Error\AuthorizationException',
+      ),
+    );
 
   /**
    * @var bool
@@ -1916,24 +1957,6 @@ class UserProfileService_doesUserExist_result {
   public $ae = null;
 
   public function __construct($vals=null) {
-    if (!isset(self::$_TSPEC)) {
-      self::$_TSPEC = array(
-        0 => array(
-          'var' => 'success',
-          'type' => TType::BOOL,
-          ),
-        1 => array(
-          'var' => 'upe',
-          'type' => TType::STRUCT,
-          'class' => '\Airavata\Service\Profile\User\CPI\Error\UserProfileServiceException',
-          ),
-        2 => array(
-          'var' => 'ae',
-          'type' => TType::STRUCT,
-          'class' => '\Airavata\API\Error\AuthorizationException',
-          ),
-        );
-    }
     if (is_array($vals)) {
       if (isset($vals['success'])) {
         $this->success = $vals['success'];
diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/user/CustomDashboard.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/user/CustomDashboard.java
new file mode 100644
index 0000000000..abb49f7937
--- /dev/null
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/user/CustomDashboard.java
@@ -0,0 +1,2912 @@
+/**
+ * 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 (1.0.0-dev)
+ *
+ * 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 (1.0.0-dev)")
+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();
+  }
+}
+
diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/user/UserProfile.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/user/UserProfile.java
index bb2151bd68..adacceec16 100644
--- a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/user/UserProfile.java
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/user/UserProfile.java
@@ -111,6 +111,7 @@
   private static final org.apache.thrift.protocol.TField GPG_KEY_FIELD_DESC = new org.apache.thrift.protocol.TField("gpgKey", org.apache.thrift.protocol.TType.STRING, (short)23);
   private static final org.apache.thrift.protocol.TField TIME_ZONE_FIELD_DESC = new org.apache.thrift.protocol.TField("timeZone", org.apache.thrift.protocol.TType.STRING, (short)24);
   private static final org.apache.thrift.protocol.TField NSF_DEMOGRAPHICS_FIELD_DESC = new org.apache.thrift.protocol.TField("nsfDemographics", org.apache.thrift.protocol.TType.STRUCT, (short)25);
+  private static final org.apache.thrift.protocol.TField CUSTOM_DASHBOARD_FIELD_DESC = new org.apache.thrift.protocol.TField("customDashboard", org.apache.thrift.protocol.TType.STRUCT, (short)26);
 
   private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new UserProfileStandardSchemeFactory();
   private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new UserProfileTupleSchemeFactory();
@@ -140,6 +141,7 @@
   private java.lang.String gpgKey; // optional
   private java.lang.String timeZone; // optional
   private NSFDemographics nsfDemographics; // optional
+  private CustomDashboard customDashboard; // 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 {
@@ -171,7 +173,8 @@
     LABELED_URI((short)22, "labeledURI"),
     GPG_KEY((short)23, "gpgKey"),
     TIME_ZONE((short)24, "timeZone"),
-    NSF_DEMOGRAPHICS((short)25, "nsfDemographics");
+    NSF_DEMOGRAPHICS((short)25, "nsfDemographics"),
+    CUSTOM_DASHBOARD((short)26, "customDashboard");
 
     private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
 
@@ -236,6 +239,8 @@ public static _Fields findByThriftId(int fieldId) {
           return TIME_ZONE;
         case 25: // NSF_DEMOGRAPHICS
           return NSF_DEMOGRAPHICS;
+        case 26: // CUSTOM_DASHBOARD
+          return CUSTOM_DASHBOARD;
         default:
           return null;
       }
@@ -280,7 +285,7 @@ public short getThriftFieldId() {
   private static final int __LASTACCESSTIME_ISSET_ID = 1;
   private static final int __VALIDUNTIL_ISSET_ID = 2;
   private byte __isset_bitfield = 0;
-  private static final _Fields optionals[] = {_Fields.MIDDLE_NAME,_Fields.NAME_PREFIX,_Fields.NAME_SUFFIX,_Fields.ORCID_ID,_Fields.PHONES,_Fields.COUNTRY,_Fields.NATIONALITY,_Fields.HOME_ORGANIZATION,_Fields.ORGINATION_AFFILIATION,_Fields.COMMENTS,_Fields.LABELED_URI,_Fields.GPG_KEY,_Fields.TIME_ZONE,_Fields.NSF_DEMOGRAPHICS};
+  private static final _Fields optionals[] = {_Fields.MIDDLE_NAME,_Fields.NAME_PREFIX,_Fields.NAME_SUFFIX,_Fields.ORCID_ID,_Fields.PHONES,_Fields.COUNTRY,_Fields.NATIONALITY,_Fields.HOME_ORGANIZATION,_Fields.ORGINATION_AFFILIATION,_Fields.COMMENTS,_Fields.LABELED_URI,_Fields.GPG_KEY,_Fields.TIME_ZONE,_Fields.NSF_DEMOGRAPHICS,_Fields.CUSTOM_DASHBOARD};
   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);
@@ -338,6 +343,8 @@ public short getThriftFieldId() {
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     tmpMap.put(_Fields.NSF_DEMOGRAPHICS, new org.apache.thrift.meta_data.FieldMetaData("nsfDemographics", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, NSFDemographics.class)));
+    tmpMap.put(_Fields.CUSTOM_DASHBOARD, new org.apache.thrift.meta_data.FieldMetaData("customDashboard", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
+        new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, CustomDashboard.class)));
     metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
     org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(UserProfile.class, metaDataMap);
   }
@@ -457,6 +464,9 @@ public UserProfile(UserProfile other) {
     if (other.isSetNsfDemographics()) {
       this.nsfDemographics = new NSFDemographics(other.nsfDemographics);
     }
+    if (other.isSetCustomDashboard()) {
+      this.customDashboard = new CustomDashboard(other.customDashboard);
+    }
   }
 
   public UserProfile deepCopy() {
@@ -495,6 +505,7 @@ public void clear() {
     this.gpgKey = null;
     this.timeZone = null;
     this.nsfDemographics = null;
+    this.customDashboard = null;
   }
 
   public java.lang.String getUserModelVersion() {
@@ -1137,6 +1148,29 @@ public void setNsfDemographicsIsSet(boolean value) {
     }
   }
 
+  public CustomDashboard getCustomDashboard() {
+    return this.customDashboard;
+  }
+
+  public void setCustomDashboard(CustomDashboard customDashboard) {
+    this.customDashboard = customDashboard;
+  }
+
+  public void unsetCustomDashboard() {
+    this.customDashboard = null;
+  }
+
+  /** Returns true if field customDashboard is set (has been assigned a value) and false otherwise */
+  public boolean isSetCustomDashboard() {
+    return this.customDashboard != null;
+  }
+
+  public void setCustomDashboardIsSet(boolean value) {
+    if (!value) {
+      this.customDashboard = null;
+    }
+  }
+
   public void setFieldValue(_Fields field, java.lang.Object value) {
     switch (field) {
     case USER_MODEL_VERSION:
@@ -1339,6 +1373,14 @@ public void setFieldValue(_Fields field, java.lang.Object value) {
       }
       break;
 
+    case CUSTOM_DASHBOARD:
+      if (value == null) {
+        unsetCustomDashboard();
+      } else {
+        setCustomDashboard((CustomDashboard)value);
+      }
+      break;
+
     }
   }
 
@@ -1419,6 +1461,9 @@ public void setFieldValue(_Fields field, java.lang.Object value) {
     case NSF_DEMOGRAPHICS:
       return getNsfDemographics();
 
+    case CUSTOM_DASHBOARD:
+      return getCustomDashboard();
+
     }
     throw new java.lang.IllegalStateException();
   }
@@ -1480,6 +1525,8 @@ public boolean isSet(_Fields field) {
       return isSetTimeZone();
     case NSF_DEMOGRAPHICS:
       return isSetNsfDemographics();
+    case CUSTOM_DASHBOARD:
+      return isSetCustomDashboard();
     }
     throw new java.lang.IllegalStateException();
   }
@@ -1724,6 +1771,15 @@ public boolean equals(UserProfile that) {
         return false;
     }
 
+    boolean this_present_customDashboard = true && this.isSetCustomDashboard();
+    boolean that_present_customDashboard = true && that.isSetCustomDashboard();
+    if (this_present_customDashboard || that_present_customDashboard) {
+      if (!(this_present_customDashboard && that_present_customDashboard))
+        return false;
+      if (!this.customDashboard.equals(that.customDashboard))
+        return false;
+    }
+
     return true;
   }
 
@@ -1825,6 +1881,10 @@ public int hashCode() {
     if (isSetNsfDemographics())
       hashCode = hashCode * 8191 + nsfDemographics.hashCode();
 
+    hashCode = hashCode * 8191 + ((isSetCustomDashboard()) ? 131071 : 524287);
+    if (isSetCustomDashboard())
+      hashCode = hashCode * 8191 + customDashboard.hashCode();
+
     return hashCode;
   }
 
@@ -2086,6 +2146,16 @@ public int compareTo(UserProfile other) {
         return lastComparison;
       }
     }
+    lastComparison = java.lang.Boolean.valueOf(isSetCustomDashboard()).compareTo(other.isSetCustomDashboard());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetCustomDashboard()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.customDashboard, other.customDashboard);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     return 0;
   }
 
@@ -2321,6 +2391,16 @@ public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.
       }
       first = false;
     }
+    if (isSetCustomDashboard()) {
+      if (!first) sb.append(", ");
+      sb.append("customDashboard:");
+      if (this.customDashboard == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.customDashboard);
+      }
+      first = false;
+    }
     sb.append(")");
     return sb.toString();
   }
@@ -2375,6 +2455,9 @@ public void validate() throws org.apache.thrift.TException {
     if (nsfDemographics != null) {
       nsfDemographics.validate();
     }
+    if (customDashboard != null) {
+      customDashboard.validate();
+    }
   }
 
   private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
@@ -2654,6 +2737,15 @@ public void read(org.apache.thrift.protocol.TProtocol iprot, UserProfile struct)
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
+          case 26: // CUSTOM_DASHBOARD
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {
+              struct.customDashboard = new CustomDashboard();
+              struct.customDashboard.read(iprot);
+              struct.setCustomDashboardIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
           default:
             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
         }
@@ -2842,6 +2934,13 @@ public void write(org.apache.thrift.protocol.TProtocol oprot, UserProfile struct
           oprot.writeFieldEnd();
         }
       }
+      if (struct.customDashboard != null) {
+        if (struct.isSetCustomDashboard()) {
+          oprot.writeFieldBegin(CUSTOM_DASHBOARD_FIELD_DESC);
+          struct.customDashboard.write(oprot);
+          oprot.writeFieldEnd();
+        }
+      }
       oprot.writeFieldStop();
       oprot.writeStructEnd();
     }
@@ -2919,7 +3018,10 @@ public void write(org.apache.thrift.protocol.TProtocol prot, UserProfile struct)
       if (struct.isSetNsfDemographics()) {
         optionals.set(13);
       }
-      oprot.writeBitSet(optionals, 14);
+      if (struct.isSetCustomDashboard()) {
+        optionals.set(14);
+      }
+      oprot.writeBitSet(optionals, 15);
       if (struct.isSetMiddleName()) {
         oprot.writeString(struct.middleName);
       }
@@ -2980,6 +3082,9 @@ public void write(org.apache.thrift.protocol.TProtocol prot, UserProfile struct)
       if (struct.isSetNsfDemographics()) {
         struct.nsfDemographics.write(oprot);
       }
+      if (struct.isSetCustomDashboard()) {
+        struct.customDashboard.write(oprot);
+      }
     }
 
     @Override
@@ -3016,7 +3121,7 @@ public void read(org.apache.thrift.protocol.TProtocol prot, UserProfile struct)
       struct.setValidUntilIsSet(true);
       struct.State = org.apache.airavata.model.user.Status.findByValue(iprot.readI32());
       struct.setStateIsSet(true);
-      java.util.BitSet incoming = iprot.readBitSet(14);
+      java.util.BitSet incoming = iprot.readBitSet(15);
       if (incoming.get(0)) {
         struct.middleName = iprot.readString();
         struct.setMiddleNameIsSet(true);
@@ -3101,6 +3206,11 @@ public void read(org.apache.thrift.protocol.TProtocol prot, UserProfile struct)
         struct.nsfDemographics.read(iprot);
         struct.setNsfDemographicsIsSet(true);
       }
+      if (incoming.get(14)) {
+        struct.customDashboard = new CustomDashboard();
+        struct.customDashboard.read(iprot);
+        struct.setCustomDashboardIsSet(true);
+      }
     }
   }
 
diff --git a/airavata-services/profile-service/profile-service-commons/src/main/java/org/apache/airavata/service/profile/commons/user/entities/CustomizedDashboardEntity.java b/airavata-services/profile-service/profile-service-commons/src/main/java/org/apache/airavata/service/profile/commons/user/entities/CustomizedDashboardEntity.java
new file mode 100644
index 0000000000..211868cf21
--- /dev/null
+++ b/airavata-services/profile-service/profile-service-commons/src/main/java/org/apache/airavata/service/profile/commons/user/entities/CustomizedDashboardEntity.java
@@ -0,0 +1,325 @@
+/*
+ *
+ * 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.
+ *
+*/
+
+
+package org.apache.airavata.service.profile.commons.user.entities;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "CUSTOMIZED_DASHBOARD")
+public class CustomizedDashboardEntity {
+
+    private String airavataInternalUserId;
+    private String experimentId;
+    private String name;
+    private String description;
+    private String project;
+    private String owner;
+    private String application;
+    private String computeResource;
+    private String jobName;
+    private String jobId;
+    private String jobStatus;
+    private String jobCreationTime;
+    private String notificationsTo;
+    private String workingDir;
+    private String jobDescription;
+    private String creationTime;
+    private String lastModifiedTime;
+    private String wallTime;
+    private String cpuCount;
+    private String nodeCount;
+    private String queue;
+    private String inputs;
+    private String outputs;
+    private String storageDir;
+    private String errors;
+
+    private UserProfileEntity userProfileEntity;
+
+    @Id
+    @Column(name = "AIRAVATA_INTERNAL_USER_ID")
+    public String getAiravataInternalUserId() {
+        return airavataInternalUserId;
+    }
+
+    public void setAiravataInternalUserId(String airavataInternalUserId) {
+        this.airavataInternalUserId = airavataInternalUserId;
+    }
+
+    @Column(name = "ENABLED_EXPERIMENT_ID")
+    public String getExperimentId() {
+        return experimentId;
+    }
+
+    public void setExperimentId(String experimentId) {
+        this.experimentId = experimentId;
+    }
+
+    @Column(name = "ENABLED_NAME")
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Column(name = "ENABLED_DESCRIPTION")
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @Column(name = "ENABLED_PROJECT")
+    public String getProject() {
+        return project;
+    }
+
+    public void setProject(String project) {
+        this.project = project;
+    }
+
+    @Column(name = "ENABLED_OWNER")
+    public String getOwner() {
+        return owner;
+    }
+
+    public void setOwner(String owner) {
+        this.owner = owner;
+    }
+
+    @Column(name = "ENABLED_APPLICATION")
+    public String getApplication() {
+        return application;
+    }
+
+    public void setApplication(String application) {
+        this.application = application;
+    }
+
+    @Column(name = "ENABLED_COMPUTE_RESOURCE")
+    public String getComputeResource() {
+        return computeResource;
+    }
+
+    public void setComputeResource(String computeResource) {
+        this.computeResource = computeResource;
+    }
+
+    @Column(name = "ENABLED_JOB_NAME")
+    public String getJobName() {
+        return jobName;
+    }
+
+    public void setJobName(String jobName) {
+        this.jobName = jobName;
+    }
+
+    @Column(name = "ENABLED_JOB_ID")
+    public String getJobId() {
+        return jobId;
+    }
+
+    public void setJobId(String jobId) {
+        this.jobId = jobId;
+    }
+
+    @Column(name = "ENABLED_JOB_STATUS")
+    public String getJobStatus() {
+        return jobStatus;
+    }
+
+    public void setJobStatus(String jobStatus) {
+        this.jobStatus = jobStatus;
+    }
+
+    @Column(name = "ENABLED_JOB_CREATION_TIME")
+    public String getJobCreationTime() {
+        return jobCreationTime;
+    }
+
+    public void setJobCreationTime(String jobCreationTime) {
+        this.jobCreationTime = jobCreationTime;
+    }
+
+    @Column(name = "ENABLED_NOTIFICATIONS_TO")
+    public String getNotificationsTo() {
+        return notificationsTo;
+    }
+
+    public void setNotificationsTo(String notificationsTo) {
+        this.notificationsTo = notificationsTo;
+    }
+
+    @Column(name = "ENABLED_WORKING_DIR")
+    public String getWorkingDir() {
+        return workingDir;
+    }
+
+    public void setWorkingDir(String workingDir) {
+        this.workingDir = workingDir;
+    }
+
+    @Column(name = "ENABLED_JOB_DESCRIPTION")
+    public String getJobDescription() {
+        return jobDescription;
+    }
+
+    public void setJobDescription(String jobDescription) {
+        this.jobDescription = jobDescription;
+    }
+
+    @Column(name = "ENABLED_CREATION_TIME")
+    public String getCreationTime() {
+        return creationTime;
+    }
+
+    public void setCreationTime(String creationTime) {
+        this.creationTime = creationTime;
+    }
+
+    @Column(name = "ENABLED_LAST_MODIFIED_TIME")
+    public String getLastModifiedTime() {
+        return lastModifiedTime;
+    }
+
+    public void setLastModifiedTime(String lastModifiedTime) {
+        this.lastModifiedTime = lastModifiedTime;
+    }
+
+    @Column(name = "ENABLED_WALL_TIME")
+    public String getWallTime() {
+        return wallTime;
+    }
+
+    public void setWallTime(String wallTime) {
+        this.wallTime = wallTime;
+    }
+
+    @Column(name = "ENABLED_CPU_COUNT")
+    public String getCpuCount() {
+        return cpuCount;
+    }
+
+    public void setCpuCount(String cpuCount) {
+        this.cpuCount = cpuCount;
+    }
+
+    @Column(name = "ENABLED_NODE_COUNT")
+    public String getNodeCount() {
+        return nodeCount;
+    }
+
+    public void setNodeCount(String nodeCount) {
+        this.nodeCount = nodeCount;
+    }
+
+    @Column(name = "ENABLED_QUEUE")
+    public String getQueue() {
+        return queue;
+    }
+
+    public void setQueue(String queue) {
+        this.queue = queue;
+    }
+
+    @Column(name = "ENABLED_INPUTS")
+    public String getInputs() {
+        return inputs;
+    }
+
+    public void setInputs(String inputs) {
+        this.inputs = inputs;
+    }
+
+    @Column(name = "ENABLED_OUTPUTS")
+    public String getOutputs() {
+        return outputs;
+    }
+
+    public void setOutputs(String outputs) {
+        this.outputs = outputs;
+    }
+
+    @Column(name = "ENABLED_STORAGE_DIR")
+    public String getStorageDir() {
+        return storageDir;
+    }
+
+    public void setStorageDir(String storageDir) {
+        this.storageDir = storageDir;
+    }
+
+    @Column(name = "ENABLED_ERRORS")
+    public String getErrors() {
+        return errors;
+    }
+
+    public void setErrors(String errors) {
+        this.errors = errors;
+    }
+
+    @OneToOne(targetEntity = UserProfileEntity.class, cascade = CascadeType.ALL)
+    @PrimaryKeyJoinColumn(name = "AIRAVATA_INTERNAL_USER_ID", referencedColumnName = "AIRAVATA_INTERNAL_USER_ID")
+    public UserProfileEntity getUserProfileEntity() {
+        return userProfileEntity;
+    }
+
+    public void setUserProfileEntity(UserProfileEntity userProfileEntity) {
+        this.userProfileEntity = userProfileEntity;
+    }
+
+    @Override
+    public String toString() {
+        return "CustomizedDashboardEntity{" +
+                "airavataInternalUserId='" + airavataInternalUserId + '\'' +
+                ", experimentId='" + experimentId + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", project='" + project + '\'' +
+                ", owner='" + owner + '\'' +
+                ", application='" + application + '\'' +
+                ", computeResource='" + computeResource + '\'' +
+                ", jobName='" + jobName + '\'' +
+                ", jobId='" + jobId + '\'' +
+                ", jobStatus='" + jobStatus + '\'' +
+                ", jobCreationTime='" + jobCreationTime + '\'' +
+                ", notificationsTo='" + notificationsTo + '\'' +
+                ", workingDir='" + workingDir + '\'' +
+                ", jobDescription='" + jobDescription + '\'' +
+                ", creationTime='" + creationTime + '\'' +
+                ", lastModifiedTime='" + lastModifiedTime + '\'' +
+                ", wallTime='" + wallTime + '\'' +
+                ", cpuCount='" + cpuCount + '\'' +
+                ", nodeCount='" + nodeCount + '\'' +
+                ", queue='" + queue + '\'' +
+                ", inputs='" + inputs + '\'' +
+                ", outputs='" + outputs + '\'' +
+                ", storageDir='" + storageDir + '\'' +
+                ", errors='" + errors + '\'' +
+                '}';
+    }
+}
diff --git a/airavata-services/profile-service/profile-service-commons/src/main/java/org/apache/airavata/service/profile/commons/user/entities/UserProfileEntity.java b/airavata-services/profile-service/profile-service-commons/src/main/java/org/apache/airavata/service/profile/commons/user/entities/UserProfileEntity.java
index e1e3e9e19e..dddcf42449 100644
--- a/airavata-services/profile-service/profile-service-commons/src/main/java/org/apache/airavata/service/profile/commons/user/entities/UserProfileEntity.java
+++ b/airavata-services/profile-service/profile-service-commons/src/main/java/org/apache/airavata/service/profile/commons/user/entities/UserProfileEntity.java
@@ -53,6 +53,7 @@
     private List<String> emails;
     private List<String> phones;
     private NSFDemographicsEntity nsfDemographics;
+    private CustomizedDashboardEntity customizedDashboardEntity;
 
     @Id
     @Column(name = "AIRAVATA_INTERNAL_USER_ID")
@@ -291,6 +292,16 @@ public void setNsfDemographics(NSFDemographicsEntity nsfDemographics) {
         this.nsfDemographics = nsfDemographics;
     }
 
+    @OneToOne(targetEntity = CustomizedDashboardEntity.class, cascade = CascadeType.ALL,
+            mappedBy = "userProfileEntity", fetch = FetchType.EAGER)
+    public CustomizedDashboardEntity getCustomizedDashboardEntity() {
+        return customizedDashboardEntity;
+    }
+
+    public void setCustomizedDashboardEntity(CustomizedDashboardEntity customizedDashboardEntity) {
+        this.customizedDashboardEntity = customizedDashboardEntity;
+    }
+
     @PrePersist
     void createdAt() {
         this.creationTime = this.lastAccessTime = new Date();
diff --git a/airavata-services/profile-service/profile-service-commons/src/main/resources/META-INF/persistence.xml b/airavata-services/profile-service/profile-service-commons/src/main/resources/META-INF/persistence.xml
index 06df649a63..08c9bed003 100644
--- a/airavata-services/profile-service/profile-service-commons/src/main/resources/META-INF/persistence.xml
+++ b/airavata-services/profile-service/profile-service-commons/src/main/resources/META-INF/persistence.xml
@@ -24,6 +24,7 @@
         <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
         <class>org.apache.airavata.service.profile.commons.user.entities.UserProfileEntity</class>
         <class>org.apache.airavata.service.profile.commons.user.entities.NSFDemographicsEntity</class>
+        <class>org.apache.airavata.service.profile.commons.user.entities.CustomizedDashboardEntity</class>
         <class>org.apache.airavata.service.profile.commons.tenant.entities.GatewayEntity</class>
         <exclude-unlisted-classes>true</exclude-unlisted-classes>
 
diff --git a/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/handlers/UserProfileServiceHandler.java b/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/handlers/UserProfileServiceHandler.java
index f27d5809ab..418adc396f 100644
--- a/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/handlers/UserProfileServiceHandler.java
+++ b/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/handlers/UserProfileServiceHandler.java
@@ -28,6 +28,7 @@
 import org.apache.airavata.model.dbevent.EntityType;
 import org.apache.airavata.model.error.AuthorizationException;
 import org.apache.airavata.model.security.AuthzToken;
+import org.apache.airavata.model.user.CustomDashboard;
 import org.apache.airavata.model.user.UserProfile;
 import org.apache.airavata.service.profile.client.ProfileServiceClientFactory;
 import org.apache.airavata.service.profile.commons.user.entities.UserProfileEntity;
diff --git a/airavata-services/profile-service/profile-user-core/src/main/resources/user_profile_catalog.sql b/airavata-services/profile-service/profile-user-core/src/main/resources/user_profile_catalog.sql
index 4653c45265..120146f30b 100644
--- a/airavata-services/profile-service/profile-user-core/src/main/resources/user_profile_catalog.sql
+++ b/airavata-services/profile-service/profile-user-core/src/main/resources/user_profile_catalog.sql
@@ -74,6 +74,36 @@ CREATE TABLE IF NOT EXISTS NSF_DEMOGRAPHIC_DISABILITY (
     FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES NSF_DEMOGRAPHIC(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
 );
 
+CREATE TABLE IF NOT EXISTS CUSTOMIZED_DASHBOARD (
+    AIRAVATA_INTERNAL_USER_ID VARCHAR (255),
+    ENABLED_EXPERIMENT_ID VARCHAR (255),
+    ENABLED_NAME VARCHAR (255),
+    ENABLED_DESCRIPTION VARCHAR (255),
+    ENABLED_PROJECT VARCHAR (255),
+    ENABLED_OWNER VARCHAR (255),
+    ENABLED_APPLICATION VARCHAR (255),
+    ENABLED_COMPUTE_RESOURCE VARCHAR (255),
+    ENABLED_JOB_NAME VARCHAR (255),
+    ENABLED_JOB_ID VARCHAR (255),
+    ENABLED_JOB_STATUS VARCHAR (255),
+    ENABLED_JOB_CREATION_TIME VARCHAR (255),
+    ENABLED_NOTIFICATIONS_TO VARCHAR (255),
+    ENABLED_WORKING_DIR VARCHAR (255),
+    ENABLED_JOB_DESCRIPTION VARCHAR (255),
+    ENABLED_CREATION_TIME VARCHAR (255),
+    ENABLED_LAST_MODIFIED_TIME VARCHAR (255),
+    ENABLED_WALL_TIME VARCHAR (255),
+    ENABLED_CPU_COUNT VARCHAR (255),
+    ENABLED_NODE_COUNT VARCHAR (255),
+    ENABLED_QUEUE VARCHAR (255),
+    ENABLED_INPUTS VARCHAR (255),
+    ENABLED_OUTPUTS VARCHAR (255),
+    ENABLED_STORAGE_DIR VARCHAR (255),
+    ENABLED_ERRORS VARCHAR (255),
+    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID)
+    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES USER_PROFILE(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
+);
+
 CREATE TABLE CONFIGURATION
 (
         CONFIG_KEY VARCHAR(255),
diff --git a/thrift-interface-descriptions/data-models/user-tenant-group-models/user_profile_model.thrift b/thrift-interface-descriptions/data-models/user-tenant-group-models/user_profile_model.thrift
index 101f29741b..9e61d3c3aa 100644
--- a/thrift-interface-descriptions/data-models/user-tenant-group-models/user_profile_model.thrift
+++ b/thrift-interface-descriptions/data-models/user-tenant-group-models/user_profile_model.thrift
@@ -109,6 +109,39 @@ struct NSFDemographics {
 }
 
 /**
+ * A structure holding the cutomized admin dashboard information.
+ *
+ *
+*/
+struct CustomDashboard {
+    1: required string airavataInternalUserId = airavata_commons.DEFAULT_ID,
+    2: optional string experimentId,
+    3: optional string name,
+    4: optional string description,
+    5: optional string project,
+    6: optional string owner,
+    7: optional string application,
+    8: optional string computeResource,
+    9: optional string jobName,
+    10: optional string jobId,
+    11: optional string jobStatus,
+    12: optional string jobCreationTime,
+    13: optional string notificationsTo,
+    14: optional string workingDir,
+    15: optional string jobDescription,
+    16: optional string creationTime,
+    17: optional string lastModifiedTime,
+    18: optional string wallTime,
+    19: optional string cpuCount,
+    20: optional string nodeCount,
+    21: optional string queue,
+    22: optional string inputs,
+    23: optional string outputs,
+    24: optional string storageDir,
+    25: optional string errors
+}
+
+/**
  * A structure holding the user profile and its child models.
  *
  * Notes:
@@ -192,5 +225,6 @@ struct UserProfile {
     22: optional list<string> labeledURI,
     23: optional string gpgKey,
     24: optional string timeZone,
-    25: optional NSFDemographics nsfDemographics
+    25: optional NSFDemographics nsfDemographics,
+    26: optional CustomDashboard customDashboard
 }
\ No newline at end of file


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


> Admin dashboard customization
> -----------------------------
>
>                 Key: AIRAVATA-2554
>                 URL: https://issues.apache.org/jira/browse/AIRAVATA-2554
>             Project: Airavata
>          Issue Type: Improvement
>          Components: PGA PHP Web Gateway
>    Affects Versions: 0.17
>            Reporter: Sachin Kariyattin
>            Assignee: Sachin Kariyattin
>            Priority: Major
>
> Currently there is no provision for admins to customize the dashboard to view the experiment details. 
> Goal: To implement dashboard customization feature so that gateway admins will be able to view flexible statistics



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Mime
View raw message