ParamsRequestClass.php 7.95 KB
<?php
/**
 * @class ParamsRequestClass
 * @brief Treats a param request. This class inherits from ProcessRequestClass
 * @details
 */
class ParamsRequestClass extends ProcessRequestClass
{
	/*
	 * @brief Init a params request
	*/
	public function init()
	{
		if (!isset($this->requestData))
			return false;
			
		if ($this->requestData->getType(ProcessTypeEnumClass::KILL))
			return true;
		
		$this->requestData->setType(ProcessTypeEnumClass::RUN);
		
		switch ($this->requestData->getRequestType())
		{
			case ParamsRequestTypeEnumClass::XMLREQUEST :
				$cmd = "";
				foreach ($this->requestData->getRequestNodes() as $requestNode)
				{
					if ($cmd != "")
						$cmd .= " && ";
					$cmd .= KernelConfigClass::getKernelBinPath()."amdaXMLRequestorTool ".$this->getRequestFilePath();
				}
				$this->requestData->setCmd($cmd);
				break;
			case ParamsRequestTypeEnumClass::PARAMGEN :
				$this->requestData->setCmd(KernelConfigClass::getKernelBinPath()."amdaParameterGenerator -p ".$this->requestData->getParamId());
				break;
			case ParamsRequestTypeEnumClass::PARAMSINFOGEN :
                                $this->requestData->setCmd(KernelConfigClass::getKernelBinPath()."amdaParameterInfo -p ".$this->requestData->getParamId());
                                break;
		}
		$this->requestData->setEnvVars(KernelConfigClass::getExecEnvVarArray());
			
		if (!parent::init())
			return false;
			
		$this->requestData->setSuccess(false);
		$this->requestData->setLastErrorMessage('Cannot init params request');

		if ($this->requestData->getCompilationPath() == '')
		{
			$this->requestData->setLastErrorMessage('Compilation path for params request not defined');
			return false;
		}

		if (!is_dir($this->requestData->getCompilationPath()))
		{
			if (!mkdir($this->requestData->getCompilationPath(),0777))
			{
				$this->requestData->setLastErrorMessage('Cannot create compilation path for params request');
				return false;
			}
		}

		if ($this->requestData->getRequestType() == ParamsRequestTypeEnumClass::XMLREQUEST)
		{
			foreach ($this->requestData->getRequestNodes() as $requestNode)
			{
				//inject time restriction
				if (count($this->requestData->getParamsTimeRestrictions()) > 0) {
					//Here
					foreach ($this->requestData->getParamsTimeRestrictions() as $paramId => $timeRestriction)
					{
						$requestNode->getParamsTimeRestrictions()->addParamTimeRestriction($paramId, strtotime($timeRestriction));
					}
				}

				//create XML request file
				$doc = new DOMDocument("1.0", "UTF-8");
				$doc->preserveWhiteSpace = false;
				$doc->formatOutput = true;

				if (!$xmlNode = $requestNode->toXMLNode($doc))
				{
					$this->requestData->setLastErrorMessage('Cannot create params request XML file for request');
					return false;
				}
			
				$doc->appendChild($xmlNode);

				if (!$doc->save($this->getRequestFilePath()))
				{
					$this->requestData->setLastErrorMessage('Cannot save params request XML file for request');
					return false;
				}
				
				//libxml_use_internal_errors(true);
				if (!$doc->schemaValidate(KernelConfigClass::getXSDRequestFilePath()))
				{
					//$error_msg = "";
					//$errors = libxml_get_errors();
					//foreach ($errors as $error) {
					//	if ($error_msg != "")
					//		$error_msg .= PHP_EOL;
					//	$error_msg .= 'XML error "'.$error->message.'" ['.$error->level.'] (Code '.$error->code.') in '.$error->file.' on line '.$error->line.' column '.$error->column;
					//}
					//libxml_clear_errors();
					
					$this->requestData->setLastErrorMessage('Params request XML file not valid for request'/*.' ('.$error_msg.')'*/);
					return false;
				}
				//libxml_use_internal_errors(false);
			}
		}

		//create config files
		KernelConfigClass::write($this->requestData->getWorkingPath(), $this->requestData->getCompilationPath(), $this->requestData->getLocalBasePath());

		//copy parameters files
		foreach ($this->requestData->getParamsToCopy() as $key => $value)
		{
			if (!file_exists($value))
			{
				$this->requestData->setLastErrorMessage('Cannot find param definition file for '.$key);
				return false;
			}
				
			$destinationFile = KernelConfigClass::getRequestParamsPath($this->requestData->getWorkingPath()).$key.".xml";
			if (!copy($value,$destinationFile))
			{
				$this->requestData->setLastErrorMessage('Cannot copy param definition file for '.$key);
				return false;
			}
			// get datasetID for statistics
			$doc = new DOMDocument("1.0", "UTF-8"); 
			if (@$doc->load($value)) {
				$dsID = $doc->getElementsByTagName('dataset_id');
				if ($dsID->length > 0) {
					if ($dsID->item(0)->nodeValue)
						$dsName = $dsID->item(0)->nodeValue;
					elseif (strpos($key, 'spase_') !== false)
						$dsName = 'impex';
					else
						$dsName = 'unknown';
						
					$this->requestData->addDatasetForStat($dsName);
				}
			}
			
			touch($destinationFile, filemtime($value));
		}

		//create processed params files
		foreach ($this->requestData->getProcessParamsToCreate() as $key => $value)
		{
			$doc = new DOMDocument("1.0", "UTF-8");
			$doc->preserveWhiteSpace = false;
			$doc->formatOutput = true;

			if (!$xmlNode = $value["param"]->toXMLNode($doc))
			{
				$this->requestData->setLastErrorMessage('Cannot create params XML file for '.$key);
				return false;
			}
				
			$doc->appendChild($xmlNode);

			/*if (!$doc->schemaValidate(KernelConfigClass::getXSDParameterFilePath()))
			 {
			$this->requestData->setLastErrorMessage('Params XML file not valid for '.$key);
			return false;
			}*/

			$destinationFile = KernelConfigClass::getRequestParamsPath($this->requestData->getWorkingPath()).$key.".xml";
			if (!$doc->save($destinationFile))
			{
				$this->requestData->setLastErrorMessage('Cannot save params XML file for '.$key);
				return false;
			}
			
			touch($destinationFile, $value["dateModif"]);
		}
		
		//create local params files
		foreach ($this->requestData->getLocalParamsToCreate() as $key => $value)
		{
			$doc = new DOMDocument("1.0", "UTF-8");
			$doc->preserveWhiteSpace = false;
			$doc->formatOutput = true;


			if (!$xmlNode = $value["param"]->toXMLNode($doc))
			{
				$this->requestData->setLastErrorMessage('Cannot create params XML file for '.$key);
				return false;
			}
				
			$doc->appendChild($xmlNode);

			$destinationFile = KernelConfigClass::getRequestParamsPath($this->requestData->getWorkingPath()).$key.".xml";
			if (!$doc->save($destinationFile))
			{
				$this->requestData->setLastErrorMessage('Cannot save params XML file for '.$key);
				return false;
			}
			
			$this->requestData->addDatasetForStat('uploadedData');
			
			touch($destinationFile, $value["dateModif"]);
		}
		//create and copy local params files
		foreach ($this->requestData->getLocalParamsToCreateAndCopy() as $key => $value)
		{
			$doc = new DOMDocument("1.0", "UTF-8");
			$doc->preserveWhiteSpace = false;
			$doc->formatOutput = true;

			if (!$xmlNode = $value["param"]->toXMLNode($doc))
			{
				$this->requestData->setLastErrorMessage('Cannot create params XML file for '.$key);
				return false;
			}
				
			$doc->appendChild($xmlNode);
			
			$originFile =  IHMConfigClass::getUserWSPath().$key.".xml";
			$destinationFile = KernelConfigClass::getRequestParamsPath($this->requestData->getWorkingPath()).$key.".xml";
			
			if (!$doc->save($destinationFile) || !$doc->save($originFile))
			{
				$this->requestData->setLastErrorMessage('Cannot save params XML file for '.$key);
				return false;
			}
			
			touch($originFile, $value["dateModif"]);
			touch($destinationFile, $value["dateModif"]);
		}
		return true;
	}
	/*
	 * @brief Run a params request
	*/
	public function run()
	{
		$amdaStat = new AmdaStats($this->requestData->getUser());
		
		if (count($this->requestData->getDatasetForStat()) > 0)
			$amdaStat->addTask(IHMConfigClass::getUserName(), $this->requestData->getTask(), $this->requestData->getDatasetForStat());
		
		return parent::run();
	}

	/*
	 * @brief Get the request file path for AMDA_Kernel
	*/
	private function getRequestFilePath()
	{
		return $this->requestData->getWorkingPath()."request_".$this->requestData->getRequestIndex().".xml";
	}
}
?>