<?php
namespace Airavata\Model\AppCatalog\AppDeployment;

/**
 * Autogenerated by Thrift Compiler (0.9.3)
 *
 * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
 *  @generated
 */
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;


/**
 * Key Value pairs to be used to set environments
 * 
 * name:
 *   Name of the environment variable such as PATH, LD_LIBRARY_PATH, NETCDF_HOME.
 * 
 * value:
 *   Value of the environment variable to set
 * 
 * envPathOrder:
 *   The order of the setting of the env variables when there are multiple env variables
 */
class SetEnvPaths {
  static $_TSPEC;

  /**
   * @var string
   */
  public $name = null;
  /**
   * @var string
   */
  public $value = null;
  /**
   * @var int
   */
  public $envPathOrder = null;

  public function __construct($vals=null) {
    if (!isset(self::$_TSPEC)) {
      self::$_TSPEC = array(
        1 => array(
          'var' => 'name',
          'type' => TType::STRING,
          ),
        2 => array(
          'var' => 'value',
          'type' => TType::STRING,
          ),
        3 => array(
          'var' => 'envPathOrder',
          'type' => TType::I32,
          ),
        );
    }
    if (is_array($vals)) {
      if (isset($vals['name'])) {
        $this->name = $vals['name'];
      }
      if (isset($vals['value'])) {
        $this->value = $vals['value'];
      }
      if (isset($vals['envPathOrder'])) {
        $this->envPathOrder = $vals['envPathOrder'];
      }
    }
  }

  public function getName() {
    return 'SetEnvPaths';
  }

  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->name);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 2:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->value);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 3:
          if ($ftype == TType::I32) {
            $xfer += $input->readI32($this->envPathOrder);
          } 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('SetEnvPaths');
    if ($this->name !== null) {
      $xfer += $output->writeFieldBegin('name', TType::STRING, 1);
      $xfer += $output->writeString($this->name);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->value !== null) {
      $xfer += $output->writeFieldBegin('value', TType::STRING, 2);
      $xfer += $output->writeString($this->value);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->envPathOrder !== null) {
      $xfer += $output->writeFieldBegin('envPathOrder', TType::I32, 3);
      $xfer += $output->writeI32($this->envPathOrder);
      $xfer += $output->writeFieldEnd();
    }
    $xfer += $output->writeFieldStop();
    $xfer += $output->writeStructEnd();
    return $xfer;
  }

}

/**
 * Job commands to be used in Pre Job, Post Job and Module Load Commands
 * 
 * command:
 *   The actual command in string format
 * 
 * commandOrder:
 *   Order of the command in the multiple command situation
 */
class CommandObject {
  static $_TSPEC;

  /**
   * @var string
   */
  public $command = null;
  /**
   * @var int
   */
  public $commandOrder = null;

  public function __construct($vals=null) {
    if (!isset(self::$_TSPEC)) {
      self::$_TSPEC = array(
        1 => array(
          'var' => 'command',
          'type' => TType::STRING,
          ),
        2 => array(
          'var' => 'commandOrder',
          'type' => TType::I32,
          ),
        );
    }
    if (is_array($vals)) {
      if (isset($vals['command'])) {
        $this->command = $vals['command'];
      }
      if (isset($vals['commandOrder'])) {
        $this->commandOrder = $vals['commandOrder'];
      }
    }
  }

  public function getName() {
    return 'CommandObject';
  }

  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->command);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 2:
          if ($ftype == TType::I32) {
            $xfer += $input->readI32($this->commandOrder);
          } 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('CommandObject');
    if ($this->command !== null) {
      $xfer += $output->writeFieldBegin('command', TType::STRING, 1);
      $xfer += $output->writeString($this->command);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->commandOrder !== null) {
      $xfer += $output->writeFieldBegin('commandOrder', TType::I32, 2);
      $xfer += $output->writeI32($this->commandOrder);
      $xfer += $output->writeFieldEnd();
    }
    $xfer += $output->writeFieldStop();
    $xfer += $output->writeStructEnd();
    return $xfer;
  }

}

/**
 * Application Module Information. A module has to be registered before registering a deployment.
 * 
 * appModuleId: Airavata Internal Unique Job ID. This is set by the registry.
 * 
 * appModuleName:
 *   Name of the application module.
 * 
 * appModuleVersion:
 *   Version of the application.
 * 
 * appModuleDescription:
 *    Descriprion of the Module
 * 
 */
class ApplicationModule {
  static $_TSPEC;

  /**
   * @var string
   */
  public $appModuleId = "DO_NOT_SET_AT_CLIENTS";
  /**
   * @var string
   */
  public $appModuleName = null;
  /**
   * @var string
   */
  public $appModuleVersion = null;
  /**
   * @var string
   */
  public $appModuleDescription = null;

  public function __construct($vals=null) {
    if (!isset(self::$_TSPEC)) {
      self::$_TSPEC = array(
        1 => array(
          'var' => 'appModuleId',
          'type' => TType::STRING,
          ),
        2 => array(
          'var' => 'appModuleName',
          'type' => TType::STRING,
          ),
        3 => array(
          'var' => 'appModuleVersion',
          'type' => TType::STRING,
          ),
        4 => array(
          'var' => 'appModuleDescription',
          'type' => TType::STRING,
          ),
        );
    }
    if (is_array($vals)) {
      if (isset($vals['appModuleId'])) {
        $this->appModuleId = $vals['appModuleId'];
      }
      if (isset($vals['appModuleName'])) {
        $this->appModuleName = $vals['appModuleName'];
      }
      if (isset($vals['appModuleVersion'])) {
        $this->appModuleVersion = $vals['appModuleVersion'];
      }
      if (isset($vals['appModuleDescription'])) {
        $this->appModuleDescription = $vals['appModuleDescription'];
      }
    }
  }

  public function getName() {
    return 'ApplicationModule';
  }

  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->appModuleId);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 2:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->appModuleName);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 3:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->appModuleVersion);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 4:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->appModuleDescription);
          } 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('ApplicationModule');
    if ($this->appModuleId !== null) {
      $xfer += $output->writeFieldBegin('appModuleId', TType::STRING, 1);
      $xfer += $output->writeString($this->appModuleId);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->appModuleName !== null) {
      $xfer += $output->writeFieldBegin('appModuleName', TType::STRING, 2);
      $xfer += $output->writeString($this->appModuleName);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->appModuleVersion !== null) {
      $xfer += $output->writeFieldBegin('appModuleVersion', TType::STRING, 3);
      $xfer += $output->writeString($this->appModuleVersion);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->appModuleDescription !== null) {
      $xfer += $output->writeFieldBegin('appModuleDescription', TType::STRING, 4);
      $xfer += $output->writeString($this->appModuleDescription);
      $xfer += $output->writeFieldEnd();
    }
    $xfer += $output->writeFieldStop();
    $xfer += $output->writeStructEnd();
    return $xfer;
  }

}

/**
 * Application Deployment Description
 * 
 * appDeploymentId: Airavata Internal Unique Job ID. This is set by the registry.
 * 
 * appModuleName:
 *   Application Module Name. This has to be precise describing the binary.
 * 
 * computeHostId:
 *   This ID maps application deployment to a particular resource previously described within Airavata.
 *   Example: Stampede is first registered and refered when registering WRF.
 * 
 * moduleLoadCmd:
 *  Command string to load modules. This will be placed in the job submisison
 *  Ex: module load amber
 * 
 * libPrependPaths:
 *  prepend to a path variable the value
 * 
 * libAppendPaths:
 *  append to a path variable the value
 * 
 * setEnvironment:
 *  assigns to the environment variable "NAME" the value
 * 
 */
class ApplicationDeploymentDescription {
  static $_TSPEC;

  /**
   * @var string
   */
  public $appDeploymentId = "DO_NOT_SET_AT_CLIENTS";
  /**
   * @var string
   */
  public $appModuleId = null;
  /**
   * @var string
   */
  public $computeHostId = null;
  /**
   * @var string
   */
  public $executablePath = null;
  /**
   * @var int
   */
  public $parallelism =   0;
  /**
   * @var string
   */
  public $appDeploymentDescription = null;
  /**
   * @var \Airavata\Model\AppCatalog\AppDeployment\CommandObject[]
   */
  public $moduleLoadCmds = null;
  /**
   * @var \Airavata\Model\AppCatalog\AppDeployment\SetEnvPaths[]
   */
  public $libPrependPaths = null;
  /**
   * @var \Airavata\Model\AppCatalog\AppDeployment\SetEnvPaths[]
   */
  public $libAppendPaths = null;
  /**
   * @var \Airavata\Model\AppCatalog\AppDeployment\SetEnvPaths[]
   */
  public $setEnvironment = null;
  /**
   * @var \Airavata\Model\AppCatalog\AppDeployment\CommandObject[]
   */
  public $preJobCommands = null;
  /**
   * @var \Airavata\Model\AppCatalog\AppDeployment\CommandObject[]
   */
  public $postJobCommands = null;
  /**
   * @var string
   */
  public $defaultQueueName = null;
  /**
   * @var int
   */
  public $defaultNodeCount = null;
  /**
   * @var int
   */
  public $defaultCPUCount = null;
  /**
   * @var int
   */
  public $defaultWalltime = null;
  /**
   * @var bool
   */
  public $editableByUser = null;

  public function __construct($vals=null) {
    if (!isset(self::$_TSPEC)) {
      self::$_TSPEC = array(
        1 => array(
          'var' => 'appDeploymentId',
          'type' => TType::STRING,
          ),
        2 => array(
          'var' => 'appModuleId',
          'type' => TType::STRING,
          ),
        3 => array(
          'var' => 'computeHostId',
          'type' => TType::STRING,
          ),
        4 => array(
          'var' => 'executablePath',
          'type' => TType::STRING,
          ),
        5 => array(
          'var' => 'parallelism',
          'type' => TType::I32,
          ),
        6 => array(
          'var' => 'appDeploymentDescription',
          'type' => TType::STRING,
          ),
        7 => array(
          'var' => 'moduleLoadCmds',
          'type' => TType::LST,
          'etype' => TType::STRUCT,
          'elem' => array(
            'type' => TType::STRUCT,
            'class' => '\Airavata\Model\AppCatalog\AppDeployment\CommandObject',
            ),
          ),
        8 => array(
          'var' => 'libPrependPaths',
          'type' => TType::LST,
          'etype' => TType::STRUCT,
          'elem' => array(
            'type' => TType::STRUCT,
            'class' => '\Airavata\Model\AppCatalog\AppDeployment\SetEnvPaths',
            ),
          ),
        9 => array(
          'var' => 'libAppendPaths',
          'type' => TType::LST,
          'etype' => TType::STRUCT,
          'elem' => array(
            'type' => TType::STRUCT,
            'class' => '\Airavata\Model\AppCatalog\AppDeployment\SetEnvPaths',
            ),
          ),
        10 => array(
          'var' => 'setEnvironment',
          'type' => TType::LST,
          'etype' => TType::STRUCT,
          'elem' => array(
            'type' => TType::STRUCT,
            'class' => '\Airavata\Model\AppCatalog\AppDeployment\SetEnvPaths',
            ),
          ),
        11 => array(
          'var' => 'preJobCommands',
          'type' => TType::LST,
          'etype' => TType::STRUCT,
          'elem' => array(
            'type' => TType::STRUCT,
            'class' => '\Airavata\Model\AppCatalog\AppDeployment\CommandObject',
            ),
          ),
        12 => array(
          'var' => 'postJobCommands',
          'type' => TType::LST,
          'etype' => TType::STRUCT,
          'elem' => array(
            'type' => TType::STRUCT,
            'class' => '\Airavata\Model\AppCatalog\AppDeployment\CommandObject',
            ),
          ),
        13 => array(
          'var' => 'defaultQueueName',
          'type' => TType::STRING,
          ),
        14 => array(
          'var' => 'defaultNodeCount',
          'type' => TType::I32,
          ),
        15 => array(
          'var' => 'defaultCPUCount',
          'type' => TType::I32,
          ),
        16 => array(
          'var' => 'defaultWalltime',
          'type' => TType::I32,
          ),
        17 => array(
          'var' => 'editableByUser',
          'type' => TType::BOOL,
          ),
        );
    }
    if (is_array($vals)) {
      if (isset($vals['appDeploymentId'])) {
        $this->appDeploymentId = $vals['appDeploymentId'];
      }
      if (isset($vals['appModuleId'])) {
        $this->appModuleId = $vals['appModuleId'];
      }
      if (isset($vals['computeHostId'])) {
        $this->computeHostId = $vals['computeHostId'];
      }
      if (isset($vals['executablePath'])) {
        $this->executablePath = $vals['executablePath'];
      }
      if (isset($vals['parallelism'])) {
        $this->parallelism = $vals['parallelism'];
      }
      if (isset($vals['appDeploymentDescription'])) {
        $this->appDeploymentDescription = $vals['appDeploymentDescription'];
      }
      if (isset($vals['moduleLoadCmds'])) {
        $this->moduleLoadCmds = $vals['moduleLoadCmds'];
      }
      if (isset($vals['libPrependPaths'])) {
        $this->libPrependPaths = $vals['libPrependPaths'];
      }
      if (isset($vals['libAppendPaths'])) {
        $this->libAppendPaths = $vals['libAppendPaths'];
      }
      if (isset($vals['setEnvironment'])) {
        $this->setEnvironment = $vals['setEnvironment'];
      }
      if (isset($vals['preJobCommands'])) {
        $this->preJobCommands = $vals['preJobCommands'];
      }
      if (isset($vals['postJobCommands'])) {
        $this->postJobCommands = $vals['postJobCommands'];
      }
      if (isset($vals['defaultQueueName'])) {
        $this->defaultQueueName = $vals['defaultQueueName'];
      }
      if (isset($vals['defaultNodeCount'])) {
        $this->defaultNodeCount = $vals['defaultNodeCount'];
      }
      if (isset($vals['defaultCPUCount'])) {
        $this->defaultCPUCount = $vals['defaultCPUCount'];
      }
      if (isset($vals['defaultWalltime'])) {
        $this->defaultWalltime = $vals['defaultWalltime'];
      }
      if (isset($vals['editableByUser'])) {
        $this->editableByUser = $vals['editableByUser'];
      }
    }
  }

  public function getName() {
    return 'ApplicationDeploymentDescription';
  }

  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->appDeploymentId);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 2:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->appModuleId);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 3:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->computeHostId);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 4:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->executablePath);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 5:
          if ($ftype == TType::I32) {
            $xfer += $input->readI32($this->parallelism);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 6:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->appDeploymentDescription);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 7:
          if ($ftype == TType::LST) {
            $this->moduleLoadCmds = array();
            $_size0 = 0;
            $_etype3 = 0;
            $xfer += $input->readListBegin($_etype3, $_size0);
            for ($_i4 = 0; $_i4 < $_size0; ++$_i4)
            {
              $elem5 = null;
              $elem5 = new \Airavata\Model\AppCatalog\AppDeployment\CommandObject();
              $xfer += $elem5->read($input);
              $this->moduleLoadCmds []= $elem5;
            }
            $xfer += $input->readListEnd();
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 8:
          if ($ftype == TType::LST) {
            $this->libPrependPaths = array();
            $_size6 = 0;
            $_etype9 = 0;
            $xfer += $input->readListBegin($_etype9, $_size6);
            for ($_i10 = 0; $_i10 < $_size6; ++$_i10)
            {
              $elem11 = null;
              $elem11 = new \Airavata\Model\AppCatalog\AppDeployment\SetEnvPaths();
              $xfer += $elem11->read($input);
              $this->libPrependPaths []= $elem11;
            }
            $xfer += $input->readListEnd();
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 9:
          if ($ftype == TType::LST) {
            $this->libAppendPaths = array();
            $_size12 = 0;
            $_etype15 = 0;
            $xfer += $input->readListBegin($_etype15, $_size12);
            for ($_i16 = 0; $_i16 < $_size12; ++$_i16)
            {
              $elem17 = null;
              $elem17 = new \Airavata\Model\AppCatalog\AppDeployment\SetEnvPaths();
              $xfer += $elem17->read($input);
              $this->libAppendPaths []= $elem17;
            }
            $xfer += $input->readListEnd();
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 10:
          if ($ftype == TType::LST) {
            $this->setEnvironment = array();
            $_size18 = 0;
            $_etype21 = 0;
            $xfer += $input->readListBegin($_etype21, $_size18);
            for ($_i22 = 0; $_i22 < $_size18; ++$_i22)
            {
              $elem23 = null;
              $elem23 = new \Airavata\Model\AppCatalog\AppDeployment\SetEnvPaths();
              $xfer += $elem23->read($input);
              $this->setEnvironment []= $elem23;
            }
            $xfer += $input->readListEnd();
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 11:
          if ($ftype == TType::LST) {
            $this->preJobCommands = array();
            $_size24 = 0;
            $_etype27 = 0;
            $xfer += $input->readListBegin($_etype27, $_size24);
            for ($_i28 = 0; $_i28 < $_size24; ++$_i28)
            {
              $elem29 = null;
              $elem29 = new \Airavata\Model\AppCatalog\AppDeployment\CommandObject();
              $xfer += $elem29->read($input);
              $this->preJobCommands []= $elem29;
            }
            $xfer += $input->readListEnd();
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 12:
          if ($ftype == TType::LST) {
            $this->postJobCommands = array();
            $_size30 = 0;
            $_etype33 = 0;
            $xfer += $input->readListBegin($_etype33, $_size30);
            for ($_i34 = 0; $_i34 < $_size30; ++$_i34)
            {
              $elem35 = null;
              $elem35 = new \Airavata\Model\AppCatalog\AppDeployment\CommandObject();
              $xfer += $elem35->read($input);
              $this->postJobCommands []= $elem35;
            }
            $xfer += $input->readListEnd();
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 13:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->defaultQueueName);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 14:
          if ($ftype == TType::I32) {
            $xfer += $input->readI32($this->defaultNodeCount);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 15:
          if ($ftype == TType::I32) {
            $xfer += $input->readI32($this->defaultCPUCount);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 16:
          if ($ftype == TType::I32) {
            $xfer += $input->readI32($this->defaultWalltime);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 17:
          if ($ftype == TType::BOOL) {
            $xfer += $input->readBool($this->editableByUser);
          } 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('ApplicationDeploymentDescription');
    if ($this->appDeploymentId !== null) {
      $xfer += $output->writeFieldBegin('appDeploymentId', TType::STRING, 1);
      $xfer += $output->writeString($this->appDeploymentId);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->appModuleId !== null) {
      $xfer += $output->writeFieldBegin('appModuleId', TType::STRING, 2);
      $xfer += $output->writeString($this->appModuleId);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->computeHostId !== null) {
      $xfer += $output->writeFieldBegin('computeHostId', TType::STRING, 3);
      $xfer += $output->writeString($this->computeHostId);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->executablePath !== null) {
      $xfer += $output->writeFieldBegin('executablePath', TType::STRING, 4);
      $xfer += $output->writeString($this->executablePath);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->parallelism !== null) {
      $xfer += $output->writeFieldBegin('parallelism', TType::I32, 5);
      $xfer += $output->writeI32($this->parallelism);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->appDeploymentDescription !== null) {
      $xfer += $output->writeFieldBegin('appDeploymentDescription', TType::STRING, 6);
      $xfer += $output->writeString($this->appDeploymentDescription);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->moduleLoadCmds !== null) {
      if (!is_array($this->moduleLoadCmds)) {
        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
      }
      $xfer += $output->writeFieldBegin('moduleLoadCmds', TType::LST, 7);
      {
        $output->writeListBegin(TType::STRUCT, count($this->moduleLoadCmds));
        {
          foreach ($this->moduleLoadCmds as $iter36)
          {
            $xfer += $iter36->write($output);
          }
        }
        $output->writeListEnd();
      }
      $xfer += $output->writeFieldEnd();
    }
    if ($this->libPrependPaths !== null) {
      if (!is_array($this->libPrependPaths)) {
        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
      }
      $xfer += $output->writeFieldBegin('libPrependPaths', TType::LST, 8);
      {
        $output->writeListBegin(TType::STRUCT, count($this->libPrependPaths));
        {
          foreach ($this->libPrependPaths as $iter37)
          {
            $xfer += $iter37->write($output);
          }
        }
        $output->writeListEnd();
      }
      $xfer += $output->writeFieldEnd();
    }
    if ($this->libAppendPaths !== null) {
      if (!is_array($this->libAppendPaths)) {
        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
      }
      $xfer += $output->writeFieldBegin('libAppendPaths', TType::LST, 9);
      {
        $output->writeListBegin(TType::STRUCT, count($this->libAppendPaths));
        {
          foreach ($this->libAppendPaths as $iter38)
          {
            $xfer += $iter38->write($output);
          }
        }
        $output->writeListEnd();
      }
      $xfer += $output->writeFieldEnd();
    }
    if ($this->setEnvironment !== null) {
      if (!is_array($this->setEnvironment)) {
        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
      }
      $xfer += $output->writeFieldBegin('setEnvironment', TType::LST, 10);
      {
        $output->writeListBegin(TType::STRUCT, count($this->setEnvironment));
        {
          foreach ($this->setEnvironment as $iter39)
          {
            $xfer += $iter39->write($output);
          }
        }
        $output->writeListEnd();
      }
      $xfer += $output->writeFieldEnd();
    }
    if ($this->preJobCommands !== null) {
      if (!is_array($this->preJobCommands)) {
        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
      }
      $xfer += $output->writeFieldBegin('preJobCommands', TType::LST, 11);
      {
        $output->writeListBegin(TType::STRUCT, count($this->preJobCommands));
        {
          foreach ($this->preJobCommands as $iter40)
          {
            $xfer += $iter40->write($output);
          }
        }
        $output->writeListEnd();
      }
      $xfer += $output->writeFieldEnd();
    }
    if ($this->postJobCommands !== null) {
      if (!is_array($this->postJobCommands)) {
        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
      }
      $xfer += $output->writeFieldBegin('postJobCommands', TType::LST, 12);
      {
        $output->writeListBegin(TType::STRUCT, count($this->postJobCommands));
        {
          foreach ($this->postJobCommands as $iter41)
          {
            $xfer += $iter41->write($output);
          }
        }
        $output->writeListEnd();
      }
      $xfer += $output->writeFieldEnd();
    }
    if ($this->defaultQueueName !== null) {
      $xfer += $output->writeFieldBegin('defaultQueueName', TType::STRING, 13);
      $xfer += $output->writeString($this->defaultQueueName);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->defaultNodeCount !== null) {
      $xfer += $output->writeFieldBegin('defaultNodeCount', TType::I32, 14);
      $xfer += $output->writeI32($this->defaultNodeCount);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->defaultCPUCount !== null) {
      $xfer += $output->writeFieldBegin('defaultCPUCount', TType::I32, 15);
      $xfer += $output->writeI32($this->defaultCPUCount);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->defaultWalltime !== null) {
      $xfer += $output->writeFieldBegin('defaultWalltime', TType::I32, 16);
      $xfer += $output->writeI32($this->defaultWalltime);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->editableByUser !== null) {
      $xfer += $output->writeFieldBegin('editableByUser', TType::BOOL, 17);
      $xfer += $output->writeBool($this->editableByUser);
      $xfer += $output->writeFieldEnd();
    }
    $xfer += $output->writeFieldStop();
    $xfer += $output->writeStructEnd();
    return $xfer;
  }

}


