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

/**
 * Autogenerated by Thrift Compiler (0.10.0)
 *
 * 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;


/**
 * Storage Resource Description
 * 
 * storageResourceId: Airavata Internal Unique Identifier to distinguish Compute Resource.
 * 
 * hostName:
 *   Fully Qualified Host Name.
 * 
 * storageResourceDescription:
 *  A user friendly description of the resource.
 * 
 * 
 * DataMovementProtocol:
 *  Option to specify a prefered data movement mechanism of the available options.
 * 
 * 
 */
class StorageResourceDescription {
  static $_TSPEC;

  /**
   * @var string
   */
  public $storageResourceId = "DO_NOT_SET_AT_CLIENTS";
  /**
   * @var string
   */
  public $hostName = null;
  /**
   * @var string
   */
  public $storageResourceDescription = null;
  /**
   * @var bool
   */
  public $enabled = null;
  /**
   * @var \Airavata\Model\Data\Movement\DataMovementInterface[]
   */
  public $dataMovementInterfaces = null;

  public function __construct($vals=null) {
    if (!isset(self::$_TSPEC)) {
      self::$_TSPEC = array(
        1 => array(
          'var' => 'storageResourceId',
          'type' => TType::STRING,
          ),
        2 => array(
          'var' => 'hostName',
          'type' => TType::STRING,
          ),
        3 => array(
          'var' => 'storageResourceDescription',
          'type' => TType::STRING,
          ),
        4 => array(
          'var' => 'enabled',
          'type' => TType::BOOL,
          ),
        5 => array(
          'var' => 'dataMovementInterfaces',
          'type' => TType::LST,
          'etype' => TType::STRUCT,
          'elem' => array(
            'type' => TType::STRUCT,
            'class' => '\Airavata\Model\Data\Movement\DataMovementInterface',
            ),
          ),
        );
    }
    if (is_array($vals)) {
      if (isset($vals['storageResourceId'])) {
        $this->storageResourceId = $vals['storageResourceId'];
      }
      if (isset($vals['hostName'])) {
        $this->hostName = $vals['hostName'];
      }
      if (isset($vals['storageResourceDescription'])) {
        $this->storageResourceDescription = $vals['storageResourceDescription'];
      }
      if (isset($vals['enabled'])) {
        $this->enabled = $vals['enabled'];
      }
      if (isset($vals['dataMovementInterfaces'])) {
        $this->dataMovementInterfaces = $vals['dataMovementInterfaces'];
      }
    }
  }

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

  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->storageResourceId);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 2:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->hostName);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 3:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->storageResourceDescription);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 4:
          if ($ftype == TType::BOOL) {
            $xfer += $input->readBool($this->enabled);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 5:
          if ($ftype == TType::LST) {
            $this->dataMovementInterfaces = array();
            $_size0 = 0;
            $_etype3 = 0;
            $xfer += $input->readListBegin($_etype3, $_size0);
            for ($_i4 = 0; $_i4 < $_size0; ++$_i4)
            {
              $elem5 = null;
              $elem5 = new \Airavata\Model\Data\Movement\DataMovementInterface();
              $xfer += $elem5->read($input);
              $this->dataMovementInterfaces []= $elem5;
            }
            $xfer += $input->readListEnd();
          } 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('StorageResourceDescription');
    if ($this->storageResourceId !== null) {
      $xfer += $output->writeFieldBegin('storageResourceId', TType::STRING, 1);
      $xfer += $output->writeString($this->storageResourceId);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->hostName !== null) {
      $xfer += $output->writeFieldBegin('hostName', TType::STRING, 2);
      $xfer += $output->writeString($this->hostName);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->storageResourceDescription !== null) {
      $xfer += $output->writeFieldBegin('storageResourceDescription', TType::STRING, 3);
      $xfer += $output->writeString($this->storageResourceDescription);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->enabled !== null) {
      $xfer += $output->writeFieldBegin('enabled', TType::BOOL, 4);
      $xfer += $output->writeBool($this->enabled);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->dataMovementInterfaces !== null) {
      if (!is_array($this->dataMovementInterfaces)) {
        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
      }
      $xfer += $output->writeFieldBegin('dataMovementInterfaces', TType::LST, 5);
      {
        $output->writeListBegin(TType::STRUCT, count($this->dataMovementInterfaces));
        {
          foreach ($this->dataMovementInterfaces as $iter6)
          {
            $xfer += $iter6->write($output);
          }
        }
        $output->writeListEnd();
      }
      $xfer += $output->writeFieldEnd();
    }
    $xfer += $output->writeFieldStop();
    $xfer += $output->writeStructEnd();
    return $xfer;
  }

}


