RequestMgr.php 10 KB
<?php
/**
 * @class RequestMgr
 * @version $Id: RequestMgr.php 2914 2015-05-19 10:31:38Z elena $
 */

class RequestMgr extends AmdaObjectMgr 
{
	public $obj;
	protected $type;
	protected $jobXml, $jobXmlName;
	protected $types = array('request', 'condition');	  	
   
	function __construct($type) 
	{
		parent::__construct('Request.xml');
		$this->type = $type;

		$this->contentRootId = $type.'-treeRootNode';
		$this->contentRootTag = $type.'List';
		$this->objTagName = $type;
		
		$this->jobXmlName = USERDIR.'jobs.xml';
		$this->jobXml = new DomDocument("1.0");
		if (file_exists($this->jobXmlName)) 
		{
			$this->jobXml->load($this->jobXmlName);
		}
		
		$this->attributes = array('name' => '');
		$this->optionalAttributes = array();
		
		if ($type == 'request' || $type == 'plottab') 
		{
			$this->id_prefix = 'req_';			
		}
		else 
		{
			$this->id_prefix = 'cond_';			
		}
       
		if (!file_exists($this->xmlName)) 
		{
			$this->createDom();
			$this->xp = new domxpath($this->contentDom); 
		}		

		putenv("USER_DATA_PATH=".USERDATADIR);
		putenv("USER_WS_PATH=".USERWSDIR); 
		putenv("PHP_CLASSES_PATH=".CLASSPATH);		
	}

	protected function setObject($obj) 
	{
		$this->obj = $obj;
	}
          
	/*
	* Delete request/condition JSON file
	*/
	protected function deleteParameter($id)
	{	
		if (file_exists(USERREQDIR.$id)) unlink(USERREQDIR.$id);
	}
        
/*
* TODO Check file JSON objects differ in names only
*/
	protected function renameOnly($p) 
	{	
		return false;
	}

	public function validNameObject($p)
	{
		if ($this->type == 'plottab') {
			if (empty($p->name)) {
				return array('valid' => false, 'error' => 'Name is required');
			}
			return array('valid' => true);
		}
		return parent::validNameObject($p);
	}

	public function renameObject($p)
        {
		if ($this->type == 'plottab') {
			//Rename a plot tab
			if (!isset($p->parent) || empty($p->parent)) {
				return array('error' => 'Missing parent definition');
			}
			$plotObj = $this->getObject($p->parent);
			if (is_array($plotObj) && isset($plotObj['error'])) {
				return array('error' => $plotObj['error']);
			}
			if (!isset($plotObj->tabs)) {
				return array('error' => 'Cannot retrieve tab in plot request');
			}
			$renameOK = FALSE;
			foreach ($plotObj->tabs as &$tab) {
				if ($tab->id == $p->id) {
					$tab->{'tab-name'} = $p->name;
					$renameOK = TRUE;
					break;
				}
			}
			if (!$renameOK) {
				return array('error' => 'Cannot retrieve tab in plot request 2');
			}
			//Save modification
			$file = fopen(USERREQDIR.$p->parent, 'w');
			fwrite($file, json_encode($plotObj));
			fclose($file);
			
			return array('id' => $p->id);
		}
		return parent::renameObject($p);
	}
	
	/* Stop Time from StartTime and Interval*/ 
	public function convertTime($obj)
	{
		$time = strtotime($obj->startDate);

		$interval = $obj->durationDay*86400 +
						$obj->durationHour*3600 +
						$obj->durationMin*60 + $obj->durationSec;
		$stopTime = gmdate("Y-m-d\TH:i:s", $time+$interval);
		$obj->stopDate = $stopTime;

		return $obj;
	} 
	//TODO 
	public function markAsUndefined($paramId)
	{
		$n_requests = 0;

		return $n_requests;
	}

	/*
	*   Get Object JSON!!! (request or condition) into Edit
	*/ 
	public function getObject($id) 
	{
		if (!file_exists(USERREQDIR.$id)) return array('error' => NO_OBJECT_FILE);
	
		if (!($objToGet = $this->contentDom->getElementById($id))) return array('error' => NO_SUCH_ID);
		
		$obj = json_decode(file_get_contents(USERREQDIR.$id));
		//if alias exists, replace parameter name by alias name        
		if (file_exists(USERWSDIR.'Alias.xml')) 
		{
			if ($this->type == 'condition') 
			{
				$obj->expression =$this->setAlias($obj->expression); 
			}
			else if ($this->type == 'request') 
			{
				for ($i=0; $i < count($obj->children); $i++) {
							for ($j=0; $j < count($obj->children[$i]->children); $j++) {
									$obj->children[$i]->children[$j]->name =  $this->setAlias($obj->children[$i]->children[$j]->name);
							}
				}
				//TODO Ajout des SCATTER
				// if $obj->children[$i]->plotType == "SCATTER" 
				//$obj->children[$i]->scatterParam->data->name pour 1 panel (bug si 2 panels devient $obj->children[$i]->scatterParam->data->data->name)
			}    
		}      
		//if Start Time - Stop Time
		if (!$obj->timeTables) $obj =  $this->convertTime($obj); 
		
		return  $obj;
	}

	/*
	* Change NAME in JSON resource
	*/
	protected function renameInResource($name, $id) 
	{	
		$obj = json_decode(file_get_contents(USERREQDIR.$id));
		$obj->name = $name;
		
		$file = fopen(USERREQDIR.$id, 'w');
		fwrite($file, json_encode($obj));
		fclose($file);
	}
                
/*
*    Make new request/condition resource file (JSON!!) and add it to content file
*    ATTENTION : it is not DD parameter!!!
*/
	protected function createParameter($p, $folder)
	{
		if ($this -> objectExistsByName($p->name)) 
		{
			$p->id  = $this->getObjectIdByName($p->name);
			$this -> deleteObject($p);
		}
		
		$this->id = $this->setId();
		
		if (!$this->id) return array('error' => ID_CREATION_ERROR);
		
		//if alias exists, replace alias name by parameter name
		if (file_exists(USERWSDIR.'Alias.xml')) 
		{
			if ($this->type == 'condition') 
			{
				$p->expression = $this->resetAlias($p->expression);
				$info = $p->expression;
			}
			else if ($this->type == 'request') 
			{
				$info = '';
				for ($i=0; $i < count($p->children); $i++) 
				{
					for ($j=0; $j < count($p->children[$i]->children); $j++) 
					{
						$p->children[$i]->children[$j]->name =  $this->resetAlias($p->children[$i]->children[$j]->name);
						$info = $info.' '.$p->children[$i]->children[$j]->name;
					}
				}
			}
		}

		$additional = array();
		if ($this->type == 'request') {
			$additional['tabs'] = array();
			if (isset($p->tabs)) {
				foreach ($p->tabs as $index => $tab) {
					$additional['tabs'][$index] = array(
						"name" => (!empty($tab->{'tab-name'})) ? $tab->{'tab-name'} : "Plot ".($index+1),
						"id" => $tab->id,
					);
				}
			}
		}
        
		$this->descFileName = USERREQDIR.$this->id;
		$p->id = $this->id;
		// save request as json
		$file = fopen($this->descFileName, 'w');
		fwrite($file, json_encode($p));
		fclose($file);

		$this -> addToContent($p, $folder);
		
		return array('id' => $this->id, 'info' => $info) + $additional;
	}
	
	public static function checkRequest($obj)
	{		  
		if (!file_exists(orbitsAllXml)) return array('success' => false, 'message' => 'no orbits descriotion file');

		//check for orbit templateArgs
		$args = array();	  	   
		switch ($obj->nodeType) 
		{
			case 'request' :
				foreach ($obj->tabs as $tab)
				{
					$timesrc = $tab->{'multi-plot-linked'} ? $obj->timesrc : $tab->timesrc;
					
					 //TODO check TT as well (first start  and last stop ?)
					if ($timesrc != 'Interval') continue;	
					// select active tab
					if (!$tab->{'multi-plot-linked'} && $tab->id != $obj->{'last-plotted-tab'}) continue;
					
					$argsTab = array();										
					foreach ($tab->panels as $panel)
					{
						$params = array();
						foreach ($panel->params as $param)
						{							 	 
							//TODO not in code spase___IMPEX_ !!!
							//TODO other models (tsyganenko etc)							
							if (preg_match("#^spase___IMPEX_#", $param->paramid))
							{	
								if ($param->template_args->url_XYZ) $params[] = $param->template_args->url_XYZ;	
							}
						}
						if (count($params) > 0) 
						{
							$argsTab['param'] = array_unique($params);
							$argsTab['startTime'] = $tab->{'multi-plot-linked'} ? $obj->startDate : $tab->startDate;
							$argsTab['stopTime'] = $tab->{'multi-plot-linked'} ? $obj->stopDate : $tab->stopDate;
						}
					}	
					if (count($argsTab) > 0) $args[] = $argsTab;
				}
				break;
			case 'condition' :
				//$argsTab = array();
				if ($obj->timesrc != 'Interval') break;
				//TODO check for condition
				break;
			case 'download' :
				$argsTab = array();
				if ($obj->timesrc != 'Interval') break;
				
				foreach ($obj->list as $param)
				{

					//TODO not in code spase___IMPEX_ !!!
					//TODO other models (tsyganenko etc)							
					if (preg_match("#^spase___IMPEX_#", $param->paramid))
					{	
						if ($param->template_args->url_XYZ) $params[] = $param->template_args->url_XYZ;	
					}
				}
				
				if (!empty($params))
				{
					// tab is not defined, iterate over $obj->tabs?
					$argsTab['param'] = array_unique($params);
					$argsTab['startTime'] = $obj->startDate;
					$argsTab['stopTime'] = $obj->stopDate;
				}
				if (count($argsTab) > 0) $args[] = $argsTab;

				break;
			case 'statistics' :
				return array('success' => true);
				break;
			default :
				return array('success' => false, 'message' => "unknown action ".$obj->nodeType);
		}

		if (count($args) === 0) return array('success' => true);

		try 
		{
			$client = new SoapClient(DD_WSDL);
		}
		catch  (SoapFault $exception)
		{
			return array('success' => false, 'message' => $exception->faultstring);
		}

		$orbitsXml = new DomDocument("1.0");
		$orbitsXml->load(orbitsAllXml);
		$tr = array('_' => ':');

        foreach ($args as $tab)
		{
			$startTime = $tab['startTime'];
			$stopTime = $tab['stopTime'];
			
			foreach ($tab['param'] as $param)
			{
				$orbitNode = $orbitsXml->getElementById($param);
				$dsId = $orbitNode->getAttribute('dataset');
				$mission = $orbitNode->getAttribute('mission');
				$target = $orbitNode->getAttribute('target');
				try {
					$res = $client->getStartStop(strtr($dsId,$tr));
					$Time = explode("-",$res);
					$orbStartTime = CommonClass::DDTimeToIso($Time[0]);
					$orbStopTime = CommonClass::DDTimeToIso($Time[1]);					
				}
				catch  (SoapFault $exception) {
					return array('success' => false, 'message' => $exception->faultstring);                        					 
				}
				
				if (($startTime > $orbStopTime) || ($stopTime < $orbStartTime))
					return array('success' => false, 'message' => "Invalid time settings :
										$mission $target orbiting <br/> $orbStartTime - $orbStopTime");
										
				if ( strtotime($stopTime) - strtotime($startTime) > IMPEX_INTERVAL_LIMIT )
					return array('success' => false, 'message' => "Too big interval for IMPEX request : ".IMPEX_INTERVAL_LIMIT/86400.." day limit!");
			}
		}

        return array('success' => true);
	}
}
?>