RequestManagerClass.php 5.02 KB
<?php
/**
 * @class RequestManagerClass
 * @brief Main class to manage a request that's come from an AMDA client
 * @details
 */
Class RequestManagerClass
{
	public static $version = "1.6.0";

/*
	* @brief Constructor
*/
	function __construct()
	{
	
	}
	
/*
	* @brief Treat a request that's come from the WebServices
*/
	public function runWSRequest($user, $userHost, $function, $service = "", $input)
	{
		if (isset($service))
				WSInputOutputClass::setService($service);
		//TODO time table conversions can be made by AMDA_Kernel
		if ($function == FunctionTypeEnumClass::PARAMS ) // || $function == FunctionTypeEnumClass::TTCONVERT)
				KernelConfigClass::setTimeToBatchMode(WSConfigClass::$timeToBatchMode);
		
		return $this->runGenericRequest(ClientTypeEnumClass::WS, $user, $userHost, $function, $input);
	}

/*
	* @brief Treat a request that's come from the IHM
*/
	public function runIHMRequest($user, $userHost, $function, $input)
	{
		return $this->runGenericRequest(ClientTypeEnumClass::IHM,$user,$userHost,$function,$input);
	}

/*
	* @brief Treat a request that's come from a test script
*/
	public function runTestRequest($user, $function, $input)
	{
		$userHost = "";
		return $this->runGenericRequest(ClientTypeEnumClass::TEST,$user,$userHost,$function,$input);
	}

/*
	* @brief Treat a request that's come from AMDA shared objects updater
*/
        public function runSharedObjectsUpdaterRequest($function, $input)
        {
		$user = "";
                $userHost = "";
                return $this->runGenericRequest(ClientTypeEnumClass::SHAREDOBJECTSUPDATER,$user,$userHost,$function,$input);
        }

/*
	* @brief Create the request instance in relation with the function type
*/
	private function createRequest($user, $userHost, $function)
	{
		switch ($function)
		{
			case FunctionTypeEnumClass::PARAMS :
			case FunctionTypeEnumClass::PARAMSGEN :
                        case FunctionTypeEnumClass::PARAMSINFOGEN :
				return new ParamsRequestClass($user, $userHost);
			case FunctionTypeEnumClass::ACTION :
				return new ParamsRequestClass($user, $userHost);
			case FunctionTypeEnumClass::PROCESSDELETE :
			case FunctionTypeEnumClass::PROCESSRUNNINGINFO :
			case FunctionTypeEnumClass::PROCESSGETINFO :
			case FunctionTypeEnumClass::PROCESSCLEAN :
			case FunctionTypeEnumClass::PROCESSGETREQUEST :
				return new ProcessRequestClass($user, $userHost);
			case FunctionTypeEnumClass::TTMERGE :
			case FunctionTypeEnumClass::TTUNION :
			case FunctionTypeEnumClass::TTCONVERT :
				return new TTRequestClass($user, $userHost);
			case FunctionTypeEnumClass::PARAMINFO :
				return new ParamInfoRequestClass($user, $userHost);
			case FunctionTypeEnumClass::USERWSINIT :
				return new UserRequestClass($user, $userHost);
			default :
				throw new Exception('Request '.$function.' not implemented.');
		}
	}

/*
	*  @brief Create an instance of the InputOutput interface in relation with the client
*/
	private function createInputOutput($user,$userHost = null,$client)
	{
		switch ($client)
		{
			case ClientTypeEnumClass::IHM :
				return new IHMInputOutputClass($user, $userHost);
			case ClientTypeEnumClass::WS :
				return new WSInputOutputClass($user, $userHost);	
			case ClientTypeEnumClass::TEST :
				return new TestInputOutputClass($user);
			case ClientTypeEnumClass::SHAREDOBJECTSUPDATER :
				return new SharedObjectsUpdaterInputOutputClass();
			default :
				throw new Exception('Client '.$client.' not implemented.');
		}
	}

/*
	* @brief Sequence used to run a request
*/
	private function runGenericRequest($client,$user,$userHost,$function,$input)
	{
		//create an instance of the InputOutput interface
		$inputOutput = $this->createInputOutput($user, $userHost, $client);

		//get the input data from the request input data by using the InputOutput interface
		$inputdata = $inputOutput->getInputData($input,$function);
	
		//create an instance of the RequestClass to run the request
		$request = $this->createRequest($user, $userHost, $function);

		if (is_array($inputdata))
		{
			$outputdata = array();
			foreach ($inputdata as $data)
				//execute the request
				$outputdata[] = $this->runSingleRequest($request,$data);
		}
		else
			$outputdata = $this->runSingleRequest($request,$inputdata);

		//get the request output data from the output data by using the InputOutput interface
		return $inputOutput->getOutput($outputdata);
	}

/*
	*  @brief Run a single request
*/
	private function runSingleRequest($request,$data)
	{
		//link the request to the input data
		$request->setData($data);
		
		//init the request
		if (!$request->init())
		{
			$crtData = $request->getData();
			if (isset($crtData))
				throw new Exception('Request initialization error  : '.$crtData->getLastErrorMessage());
			else
				throw new Exception('Cannot init request. Unknown error.');
		}

		//run the request
		if (!$request->run())
		{
			$crtData = $request->getData();
			if ($crtData)
				throw new Exception('Request execution error  : '.$crtData->getLastErrorMessage());
			else
				throw new Exception('Cannot run request. Unknown error.');
		}

		return $request->getData();
	}
}
?>