From 96fa912db33d9481600fa16877252e6f9cf30717 Mon Sep 17 00:00:00 2001 From: Hacene SI HADJ MOHAND Date: Tue, 11 May 2021 17:51:31 +0200 Subject: [PATCH] ihm level instead of values --- src/InputOutput/IHMImpl/Tools/IHMParamManagerClass.php | 1668 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1 file changed, 827 insertions(+), 841 deletions(-) diff --git a/src/InputOutput/IHMImpl/Tools/IHMParamManagerClass.php b/src/InputOutput/IHMImpl/Tools/IHMParamManagerClass.php index 29083a3..787bb52 100644 --- a/src/InputOutput/IHMImpl/Tools/IHMParamManagerClass.php +++ b/src/InputOutput/IHMImpl/Tools/IHMParamManagerClass.php @@ -5,846 +5,832 @@ * @brief Parameter manager * @details */ -class IHMParamManagerClass -{ - protected $userParameterMgr = null; - protected $templateParamsManager = null; - protected $paramImpexMgr = null; - protected $ttCatMgr = null; - - protected $cacheExpressionParser = null; - - /* - * @brief Constructor - */ - function __construct() - { - $this->templateParamsManager = new IHMParamTemplateClass(); - $this->cacheExpressionParser = array(); - } - - public function addGeneratedParam($paramId, $expression, $sampling_mode, $sampling_step, $ref_param, $paramsData) - { - $expressionInfo = $this->parseExpression($expression, $paramsData->getWorkingPath()); - if (!$expressionInfo['success']) { - throw new Exception($expressionInfo['message']); - } - - //create a process param for the derived parameter - $this->addProcessParam($paramId, $expressionInfo["expression"], $expression, - $expressionInfo['params'], $sampling_mode, $sampling_step, $ref_param, - 0, time(), "", "", $paramsData); - } - - /* - * @brief Add an existing parameter - */ - public function addExistingParam($param, $paramsData, $templateArgs = NULL, $tableLink = NULL) - { - if ($this->isDerivedParam($param)) - return $this->addDerivedParam($param,$paramsData); - else if ($this->isUploadedParam($param)) - return $this->addUploadedParam($param,$paramsData); - else if ($this->isImpexParam($param)) - return $this->addImpexParam($param,$paramsData,$templateArgs); - else - return $this->addLocalParam($param,$paramsData,$templateArgs, $tableLink); - return ""; - } - - /* - * @brief Add a process parameter - */ - public function addProcessParam($paramId,$expression,$expression_info,$params, $sampling_mode, $sampling_step, $ref_param, $gap,$dateModif,$units,$ytitle,$paramsData) - { - $paramsData->addProcessParamToCreate($paramId, $expression, $expression_info, $params, $sampling_mode, $sampling_step, $ref_param, $gap,$dateModif, $units, $ytitle); - - foreach ($params as $param) { - $template_args = NULL; - - if (array_key_exists("template_args", $param)) - $template_args = $param["template_args"]; - - $this->addExistingParam($param["paramid"],$paramsData,$template_args); - } - if (!empty($ref_param)) { - $this->addExistingParam($ref_param, $paramsData,$template_args); - } - - return true; - } - - /* - * @brief Add a TT or catalog parameter - */ - public function addTTCatParam($paramId, $paramsData) - { - if (!isset($this->ttCatMgr)) { - $this->ttCatMgr = new IHMTTCatLoaderClass(); - } - $info = $this->ttCatMgr->getTTCatInfoFromId($paramId); - - if (!$info["success"]) { - throw new Exception($info["message"]); - } - - $status = array(); - $units = ""; - $ytitle = ""; - $flag = ""; - - if ($info["info"]["isCatalog"]) { - $parameters = $this->ttCatMgr->getCatalogParameters($paramId); - if (!$parameters["success"] || empty($parameters["parameters"])) { - throw new Exception("Error to extract first parameter of ".$paramId); - } - //For the moment, use the first parameter - $parameter = $parameters["parameters"][0]; - $units = $parameter["units"]; - $ytitle = !empty($parameter["name"]) ? $parameter["name"] : $parameter["id"]; - $flag = $parameter["id"]; - $description = $parameter["description"]; - $desc_parts = array(); - foreach (explode("-",$description) as $def) { - $def = trim($def); - $p = strpos($def, ":"); - if ($p === FALSE) { - continue; - } - $val = substr($def, 0, $p); - $val = trim($val); - $name = substr($def, $p+1); - $name = trim($name); - $color = ""; - $p = strpos($name, "["); - if ($p !== FALSE) { - $color = substr($name, $p); - $color = trim($color); - $name = substr($name, 0, $p); - $name = trim($name); - } - $status[] = array( - "min" => floatval($val), - "max" => floatval($val), - "name" => $name, - "color" => $color, - ); - } - } - else { - $status = array( - array( - "min" => 1, - "max" => 1, - "name" => "Inside", - "color" => "[255,0,0]", - ) - ); - $ytitle = $info["info"]["name"]; - } - - $paramsData->addTTCatParamToCreate($paramId, $info["info"]["path"], $info["info"]["isShared"], filemtime($info["info"]["path"]), $units, $ytitle, $status, $flag); - return array("id" => $paramId, "indexes" => array(), "calib_infos" => array()); - } - - /* - * @brief Detect if it's a derived parameter - */ - private function isDerivedParam($param) - { - return preg_match("#^ws_#",$param); - } - - /* - * @brief Detect if it's a uploaded parameter - */ - public function isUploadedParam($param) - { - return preg_match("#^wsd_#",$param); - } - - /* - * @brief Detect if it's IMPEX parameter - */ - private function isImpexParam($param) - { - return preg_match("#^".IHMImpexParamClass::$paramPrefix."#",$param); - } - - /* - * @brief Add a local parameter - */ - private function addLocalParam($param, $paramsData, $templateArgs, $tableLink) - { - //local parameter - $indexes = array(); - $calib_infos = array(); - //check for components - $pattern = "/(?P.*)\((?P.*)\)/"; - preg_match_all($pattern, $param, $matches); - if ((count($matches["param"]) > 0) && (count($matches["components"]) > 0)) - { - $paramId = $matches["param"][0]; - $indexes = explode(",",$matches["components"][0]); - } - else - $paramId = $param; - - //check templated parameter - $real_param_id = $paramId; - $paramPath = ""; - if ($this->templateParamsManager->isTemplatedParam($paramId)) { - $paramPath = $this->templateParamsManager->generateTemplatedParamFile($paramId, $templateArgs, $tableLink); - $real_param_id = $this->templateParamsManager->getTemplatedParamId($paramId, $templateArgs); - if (empty($paramPath) || !file_exists($paramPath)) - throw new Exception('Cannot generate parameter template file '.$paramId); - } - else { - $paramPath = IHMConfigClass::getLocalParamDBPath().$paramId.".xml"; - if (!file_exists($paramPath)) - throw new Exception('Cannot find parameter local file '.$paramId); - } - - $paramsData->addParamToCopy($real_param_id,$paramPath); - - $this->addLinkedLocalParams($paramId, $paramsData, $templateArgs); - - return array("id" => $real_param_id, "indexes" => $indexes, "calib_infos" => $calib_infos, "path" => $paramPath); - } - - /* - * @brief Add linked parameter - */ - private function addLinkedLocalParams($paramId,$paramsData,$templateArgs = NULL) - { - $doc = new DOMDocument("1.0", "UTF-8"); - $doc->preserveWhiteSpace = false; - $doc->formatOutput = true; - - $real_param_id = $paramId; - if ($this->templateParamsManager->isTemplatedParam($paramId)) { - $paramPath = $this->templateParamsManager->getTemplatePath($paramId); - if (empty($paramPath) || !@$doc->load($paramPath)) - throw new Exception('Cannot find parameter template file '.$paramId); - } - else { - $paramPath = IHMConfigClass::getLocalParamDBPath().$paramId.".xml"; - if (empty($paramPath) || !@$doc->load($paramPath)) - throw new Exception('Cannot find parameter local file '.$paramId); - } - - // - $getNodes = $doc->getElementsByTagName('get'); - - if ($getNodes->length <= 0) - throw new Exception('Parameter local file '.$paramId.' dont have a getter node'); - - $getNode = $getNodes->item(0); - - // - $amdaParamNodes = $doc->getElementsByTagName('amdaParam'); - - foreach($amdaParamNodes as $amdaParamNode) - { - $linkedParamId = $amdaParamNode->getAttribute('name'); - if (empty($linkedParamId)) - continue; - $template_id = $this->templateParamsManager->getTemplateId($linkedParamId); - $tempArgs = isset($templateArgs) ? $templateArgs : array(); - if ($template_id !== FALSE) { - $linkedParamId = $template_id; - } - else { - $linkedParamId = $this->templateParamsManager->replaceArgs($linkedParamId, $templateArgs); - $parsedParam = $this->templateParamsManager->parseTemplatedParam($linkedParamId); - if ($parsedParam !== FALSE) { - $linkedParamId = $parsedParam['paramid']; - foreach ($parsedParam['template_args'] as $key => $val) { - $tempArgs[$key] = $val; - } - } - } - - if ($this->templateParamsManager->isTemplatedParam($linkedParamId)) { - $linkedParamPath = $this->templateParamsManager->generateTemplatedParamFile($linkedParamId, $tempArgs); - $real_linked_param_id = $this->templateParamsManager->getTemplatedParamId($linkedParamId, $tempArgs); - } - else { - $real_linked_param_id = $linkedParamId; - $linkedParamPath = IHMConfigClass::getLocalParamDBPath().$real_linked_param_id.".xml"; - } - $paramsData->addParamToCopy($real_linked_param_id,$linkedParamPath); - $this->addLinkedLocalParams($linkedParamId, $paramsData); - } - } - - /* - * @brief Add derived parameter - */ - private function addDerivedParam($param,$paramsData) - { - $time = time(); - if (!isset($this->userParameterMgr)) - $this->userParameterMgr = new IHMUserParamManagerClass(); - - //get derived parameter info - $res = $this->userParameterMgr->getDerivedParameterFromName($param); - - if (!$res["success"]) - throw new Exception('Error to load derived parameter file : '.$res["message"]); - - if (isset($res["param"]["info"]["parsedExpression"])) { - //Re use existing parsed expression info - $expressionInfo = $res["param"]["info"]["parsedExpression"]; - } - else { - //parse expression - $expressionInfo = $this->parseExpression($res["param"]["expression"], $paramsData->getWorkingPath()); - - if (!$expressionInfo['success']) { - throw new Exception($expressionInfo['message']); - } - - $paramsList = array(); - foreach ($expressionInfo['params'] as $p) { - $paramsList[] = $p["paramid"]; - } - $this->userParameterMgr->saveDerivedParameterParsedExpression($res["param"]["id"], $expressionInfo["expression"], md5($res["param"]["expression"]), $paramsList); - } - - $paramId = $param; - - //create a process param for the derived parameter - $this->addProcessParam($paramId, $expressionInfo["expression"], $res["param"]["expression"], - $expressionInfo['params'], $res["param"]["info"]["sampling_mode"], $res["param"]["info"]["timestep"], $res["param"]["info"]["reference_param"], - 0,$res["param"]["dateModif"],!empty($res["param"]["info"]["units"]) ? $res["param"]["info"]["units"] : "", - !empty($res["param"]["info"]["yTitle"]) ? $res["param"]["info"]["yTitle"] : "", $paramsData); - - return array("id" => $paramId, "indexes" => array(), "calib_infos" => array()); - } - - /* - * @brief Add IMPEX parameter : create dynamically xml parameter descriptor in user WS - */ - private function addImpexParam($param,$paramsData,$templateArgs = NULL) - { - if (!isset($this->paramImpexMgr)) - $this->paramImpexMgr = new ImpexParamManager(); - - $parameterID = $this->paramImpexMgr->getImpexFullParamId($param, $templateArgs); - - $requestNodes = $paramsData->getRequestNodes(); - - // it is PARAMSGEN - if (!$requestNodes) { - return array("id" => $parameterID); - } - - $timesNode = $requestNodes[0]->getTimesNode(); - $intervals = $timesNode->getIntervals(); - $originFile = IHMConfigClass::getUserWSPath().$parameterID.".xml"; - - if (!file_exists($originFile)) { - // create IMPEX parameter info and data - $res = $this->paramImpexMgr->createImpexParameter($param, $intervals, $templateArgs); - - if (!$res["success"]) - throw new Exception('Error to create IMPEX parameter : '.$res["message"]); - - $newParamNode = $paramsData->addLocalParamToCreate($res["param"]["id"], - $res["param"]["info"]["viId"], $res["param"]["info"]["realVar"], - $res["param"]["info"]["minSampling"], $res["param"]["info"]["maxSampling"], - $res["param"]["info"]["type"],$res["param"]["info"]["size"], - NULL,$res["param"]["dateModif"],true); - - $newParamNode->getInfo()->setName($res["param"]["info"]['name']); - $newParamNode->getInfo()->setShortName($res["param"]["info"]['name']); - $newParamNode->getInfo()->setUnits($res["param"]["info"]['units']); - - $tableDef = $res["param"]["info"]["tableDef"]; - if (isset($tableDef) && array_key_exists('tableDefType', $tableDef) && ($tableDef['tableDefType'] != 'NONE')) - { - switch ($tableDef['channelsDefType']) - { - case 'BOUND' : - $boundTable = $newParamNode->getInfo()->addTable(InfoParamTableTypeEnum::BOUNDS, $res["param"]["info"]["yTitle"]); - $boundTable->setUnits($res["param"]["info"]["yUnits"]); - switch ($tableDef['tableDefType']) - { - case 'SELECT' : - $boundTable->setBoundsName($tableDef['data']['bound']); - $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['bound']); - break; - default : - throw new Exception("Unknown tableDefType ".$tableDef['tableDefType']); - } - break; - case 'CENTER' : - $centerTable = $newParamNode->getInfo()->addTable(InfoParamTableTypeEnum::CENTER, $res["param"]["info"]["yTitle"]); - $centerTable->setUnits($res["param"]["info"]["yUnits"]); - $centerTable->setSize($tableDef['data']['width']); - switch ($tableDef['tableDefType']) - { - case 'SELECT' : - $centerTable->setCenterName($tableDef['data']['center']); - $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['center']); - break; - default : - throw new Exception("Unknown tableDefType ".$tableDef['tableDefType']); - } - break; - default : - throw new Exception("Unknown tableDefType ".$tableDef['channelsDefType']); - } - } - - return array("id" => $res["param"]["id"], "plotType" => $res["param"]["info"]["plotType"]); - } - else { - // add IMPEX parameter data - $this->paramImpexMgr->addImpexData($param, $intervals, $templateArgs); - $paramsData->addParamToCopy($parameterID, $originFile); - - return array("id" => $parameterID); - } - } - - /* - * @brief Add uploaded parameter - */ - private function addUploadedParam($param,$paramsData) - { - if (!isset($this->userParameterMgr)) - $this->userParameterMgr = new IHMUserParamManagerClass(); - - //get uploaded parameter info - $res = $this->userParameterMgr->getUploadedParameterFromName($param); - - if (!$res["success"]) - throw new Exception('Error to load uploaded parameter file : '.$res["message"]); - - $paramId = $param; - - $newParamNode = $paramsData->addLocalParamToCreate($paramId, - $res["param"]["info"]["viId"], $res["param"]["info"]["realVar"], - $res["param"]["info"]["minSampling"], $res["param"]["info"]["maxSampling"], - $res["param"]["info"]["type"],$res["param"]["info"]["size"], - $res["param"]["info"]["fillValue"],$res["param"]["dateModif"]); - - if (!empty($res["param"]["info"]["yTitle"])) { - $newParamNode->getInfo()->setName($res["param"]["info"]['yTitle']); - $newParamNode->getInfo()->setShortName($res["param"]["info"]['yTitle']); - } - if (!empty($res["param"]["info"]['units'])) { - $newParamNode->getInfo()->setUnits($res["param"]["info"]['units']); - } - - - $tableDef = $res["param"]["info"]["tableDef"]; - if (isset($tableDef) && array_key_exists('tableDefType', $tableDef) && ($tableDef['tableDefType'] != 'NONE')) - { - $tableName = empty($tableDef['tableName']) ? 'Table' : $tableDef['tableName']; - $tableUnits = empty($tableDef['tableUnits']) ? '' : $tableDef['tableUnits']; - switch ($tableDef['channelsDefType']) - { - case 'MINMAX' : - $minMaxTable = $newParamNode->getInfo()->addTable(InfoParamTableTypeEnum::MINMAX, $tableName); - $minMaxTable->setUnits($tableUnits); - switch ($tableDef['tableDefType']) - { - case 'SELECT' : - $minMaxTable->setMinName($tableDef['data']['min']); - $minMaxTable->setMaxName($tableDef['data']['max']); - $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['min']); - $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['max']); - break; - case 'MANUAL' : - $minMaxTable->setMinName('min'); - $minMaxTable->setMaxName('max'); - $clbMinNode = $newParamNode->addClbManual('min'); - $clbMinValues = explode(',', $tableDef['data']['min']); - foreach ($clbMinValues as $value) - $clbMinNode->addClbValue($value); - $clbMaxNode = $newParamNode->addClbManual('max'); - $clbMaxValues = explode(',', $tableDef['data']['max']); - foreach ($clbMaxValues as $value) - $clbMaxNode->addClbValue($value); - break; - } - break; - case 'BOUND' : - $boundTable = $newParamNode->getInfo()->addTable(InfoParamTableTypeEnum::BOUNDS, $tableName); - $boundTable->setUnits($tableUnits); - switch ($tableDef['tableDefType']) - { - case 'SELECT' : - $boundTable->setBoundsName($tableDef['data']['bound']); - $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['bound']); - break; - case 'MANUAL' : - $boundTable->setBoundsName('bound'); - $clbBoundNode = $newParamNode->addClbManual('bound'); - $clbBoundValues = explode(',', $tableDef['data']['bound']); - foreach ($clbBoundValues as $value) - $clbBoundNode->addClbValue($value); - break; - } - break; - case 'CENTER' : - $centerTable = $newParamNode->getInfo()->addTable(InfoParamTableTypeEnum::CENTER, $tableName); - $centerTable->setUnits($tableUnits); - $centerTable->setSize($tableDef['data']['width']); - switch ($tableDef['tableDefType']) - { - case 'SELECT' : - $centerTable->setCenterName($tableDef['data']['center']); - $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['center']); - break; - case 'MANUAL' : - $centerTable->setCenterName('center'); - $clbCenterNode = $newParamNode->addClbManual('center'); - $clbCenterValues = explode(',', $tableDef['data']['center']); - foreach ($clbCenterValues as $value) - $clbCenterNode->addClbValue($value); - break; - } - break; - case 'CENTERWIDTH' : - $centerWidthTable = $newParamNode->getInfo()->addTable(InfoParamTableTypeEnum::CENTERWIDTH, $tableName); - $centerWidthTable->setUnits($tableUnits); - switch ($tableDef['tableDefType']) - { - case 'SELECT' : - $centerWidthTable->setCenterName($tableDef['data']['center']); - $centerWidthTable->setWidthName($tableDef['data']['width']); - $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['center']); - $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['width']); - break; - case 'MANUAL' : - $centerWidthTable->setCenterName('center'); - $centerWidthTable->setWidthName('width'); - $clbCenterNode = $newParamNode->addClbManual('center'); - $clbWidthNode = $newParamNode->addClbManual('width'); - $clbCenterValues = explode(',', $tableDef['data']['center']); - foreach ($clbCenterValues as $value) - $clbCenterNode->addClbValue($value); - $clbWidthValues = explode(',', $tableDef['data']['width']); - foreach ($clbWidthValues as $value) - $clbWidthNode->addClbValue($value); - break; - } - break; - } - } - - return array("id" => $paramId, "plotType" => $res["param"]["info"]["plotType"]); - } - - public function applyFilter($paramsData, $paramData, &$paramInfo) { - $filter = (isset($paramData->{'filter_spikes'}) && ($paramData->{'filter_spikes'}))? true:false; - if(!$filter){ - return; - } - $my_type= $paramData->{'type'}; - - switch ($paramData->{'type'}) { - case 0: - break; - case 1: - // vector - $dim1_index = ($dim1_is_range || !isset($paramData->{'dim1-index'}) || ($paramData->{'dim1-index'} == '')) ? '*' : $paramData->{'dim1-index'}; - $dim2_index = ($dim2_is_range || !isset($paramData->{'dim2-index'}) || ($paramData->{'dim2-index'} == '')) ? '*' : $paramData->{'dim2-index'}; - $factor = !empty($paramData->{'filter_spikes_factor'}) ? $paramData->{'filter_spikes_factor'} : 5; - $nPoints = !empty($paramData->{'filter_spikes_nPoints'}) ? $paramData->{'filter_spikes_nPoints'} : 100; - if($dim1_index != '*'){ - $template_args = array( - 'paramid' => $paramInfo['id'], - 'factor' => $factor, - 'nPoints' => $nPoints, - 'index' => $dim1_index - ); - $paramInfo = $this->addExistingParam('filter_spikes_component', $paramsData, $template_args); - }else{ - $template_args = array( - 'paramid' => $paramInfo['id'], - 'factor' => $factor, - 'nPoints' => $nPoints, - ); - $paramInfo = $this->addExistingParam('filter_spikes', $paramsData, $template_args); - } - break; - case 2: - return array('success' => FALSE, 'message' => '2D Table filtering not implémented yet'); - - } +class IHMParamManagerClass { + + protected $userParameterMgr = null; + protected $templateParamsManager = null; + protected $paramImpexMgr = null; + protected $ttCatMgr = null; + protected $cacheExpressionParser = null; + + /* + * @brief Constructor + */ + + function __construct() { + $this->templateParamsManager = new IHMParamTemplateClass(); + $this->cacheExpressionParser = array(); + } + + public function addGeneratedParam($paramId, $expression, $sampling_mode, $sampling_step, $ref_param, $paramsData) { + $expressionInfo = $this->parseExpression($expression, $paramsData->getWorkingPath()); + if (!$expressionInfo['success']) { + throw new Exception($expressionInfo['message']); + } + + //create a process param for the derived parameter + $this->addProcessParam($paramId, $expressionInfo["expression"], $expression, $expressionInfo['params'], $sampling_mode, $sampling_step, $ref_param, 0, time(), "", "", $paramsData); + } + + /* + * @brief Add an existing parameter + */ + + public function addExistingParam($param, $paramsData, $templateArgs = NULL, $tableLink = NULL) { + if ($this->isDerivedParam($param)) + return $this->addDerivedParam($param, $paramsData); + else if ($this->isUploadedParam($param)) + return $this->addUploadedParam($param, $paramsData); + else if ($this->isImpexParam($param)) + return $this->addImpexParam($param, $paramsData, $templateArgs); + else + return $this->addLocalParam($param, $paramsData, $templateArgs, $tableLink); + return ""; + } + + /* + * @brief Add a process parameter + */ + + public function addProcessParam($paramId, $expression, $expression_info, $params, $sampling_mode, $sampling_step, $ref_param, $gap, $dateModif, $units, $ytitle, $paramsData) { + $paramsData->addProcessParamToCreate($paramId, $expression, $expression_info, $params, $sampling_mode, $sampling_step, $ref_param, $gap, $dateModif, $units, $ytitle); + + foreach ($params as $param) { + $template_args = NULL; + + if (array_key_exists("template_args", $param)) + $template_args = $param["template_args"]; + + $this->addExistingParam($param["paramid"], $paramsData, $template_args); + } + if (!empty($ref_param)) { + $this->addExistingParam($ref_param, $paramsData, $template_args); + } + + return true; + } + + /* + * @brief Add a TT or catalog parameter + */ + + public function addTTCatParam($paramId, $paramsData) { + if (!isset($this->ttCatMgr)) { + $this->ttCatMgr = new IHMTTCatLoaderClass(); + } + $info = $this->ttCatMgr->getTTCatInfoFromId($paramId); + + if (!$info["success"]) { + throw new Exception($info["message"]); + } + + $status = array(); + $units = ""; + $ytitle = ""; + $flag = ""; + + if ($info["info"]["isCatalog"]) { + $parameters = $this->ttCatMgr->getCatalogParameters($paramId); + if (!$parameters["success"] || empty($parameters["parameters"])) { + throw new Exception("Error to extract first parameter of " . $paramId); + } + //For the moment, use the first parameter + $parameter = $parameters["parameters"][0]; + $units = $parameter["units"]; + $ytitle = !empty($parameter["name"]) ? $parameter["name"] : $parameter["id"]; + $flag = $parameter["id"]; + $description = $parameter["description"]; + $desc_parts = array(); + foreach (explode("-", $description) as $def) { + $def = trim($def); + $p = strpos($def, ":"); + if ($p === FALSE) { + continue; + } + $val = substr($def, 0, $p); + $val = trim($val); + $name = substr($def, $p + 1); + $name = trim($name); + $color = ""; + $p = strpos($name, "["); + if ($p !== FALSE) { + $color = substr($name, $p); + $color = trim($color); + $name = substr($name, 0, $p); + $name = trim($name); + } + $status[] = array( + "min" => floatval($val), + "max" => floatval($val), + "name" => $name, + "color" => $color, + ); + } + } else { + $status = array( + array( + "min" => 1, + "max" => 1, + "name" => "Inside", + "color" => "[255,0,0]", + ) + ); + $ytitle = $info["info"]["name"]; + } + + $paramsData->addTTCatParamToCreate($paramId, $info["info"]["path"], $info["info"]["isShared"], filemtime($info["info"]["path"]), $units, $ytitle, $status, $flag); + return array("id" => $paramId, "indexes" => array(), "calib_infos" => array()); + } + + /* + * @brief Detect if it's a derived parameter + */ + + private function isDerivedParam($param) { + return preg_match("#^ws_#", $param); + } + + /* + * @brief Detect if it's a uploaded parameter + */ + + public function isUploadedParam($param) { + return preg_match("#^wsd_#", $param); + } + + /* + * @brief Detect if it's IMPEX parameter + */ + + private function isImpexParam($param) { + return preg_match("#^" . IHMImpexParamClass::$paramPrefix . "#", $param); + } + + /* + * @brief Add a local parameter + */ + + private function addLocalParam($param, $paramsData, $templateArgs, $tableLink) { + //local parameter + $indexes = array(); + $calib_infos = array(); + //check for components + $pattern = "/(?P.*)\((?P.*)\)/"; + preg_match_all($pattern, $param, $matches); + if ((count($matches["param"]) > 0) && (count($matches["components"]) > 0)) { + $paramId = $matches["param"][0]; + $indexes = explode(",", $matches["components"][0]); + } else + $paramId = $param; + + //check templated parameter + $real_param_id = $paramId; + $paramPath = ""; + if ($this->templateParamsManager->isTemplatedParam($paramId)) { + $paramPath = $this->templateParamsManager->generateTemplatedParamFile($paramId, $templateArgs, $tableLink); + $real_param_id = $this->templateParamsManager->getTemplatedParamId($paramId, $templateArgs); + if (empty($paramPath) || !file_exists($paramPath)) + throw new Exception('Cannot generate parameter template file ' . $paramId); + } + else { + $paramPath = IHMConfigClass::getLocalParamDBPath() . $paramId . ".xml"; + if (!file_exists($paramPath)) + throw new Exception('Cannot find parameter local file ' . $paramId); + } + + $paramsData->addParamToCopy($real_param_id, $paramPath); + + $this->addLinkedLocalParams($paramId, $paramsData, $templateArgs); + + return array("id" => $real_param_id, "indexes" => $indexes, "calib_infos" => $calib_infos, "path" => $paramPath); + } + + /* + * @brief Add linked parameter + */ + + private function addLinkedLocalParams($paramId, $paramsData, $templateArgs = NULL) { + $doc = new DOMDocument("1.0", "UTF-8"); + $doc->preserveWhiteSpace = false; + $doc->formatOutput = true; + + $real_param_id = $paramId; + if ($this->templateParamsManager->isTemplatedParam($paramId)) { + $paramPath = $this->templateParamsManager->getTemplatePath($paramId); + if (empty($paramPath) || !@$doc->load($paramPath)) + throw new Exception('Cannot find parameter template file ' . $paramId); + } + else { + $paramPath = IHMConfigClass::getLocalParamDBPath() . $paramId . ".xml"; + if (empty($paramPath) || !@$doc->load($paramPath)) + throw new Exception('Cannot find parameter local file ' . $paramId); + } + + // + $getNodes = $doc->getElementsByTagName('get'); + + if ($getNodes->length <= 0) + throw new Exception('Parameter local file ' . $paramId . ' dont have a getter node'); + + $getNode = $getNodes->item(0); + + // + $amdaParamNodes = $doc->getElementsByTagName('amdaParam'); + + foreach ($amdaParamNodes as $amdaParamNode) { + $linkedParamId = $amdaParamNode->getAttribute('name'); + if (empty($linkedParamId)) + continue; + $template_id = $this->templateParamsManager->getTemplateId($linkedParamId); + $tempArgs = isset($templateArgs) ? $templateArgs : array(); + if ($template_id !== FALSE) { + $linkedParamId = $template_id; + } else { + $linkedParamId = $this->templateParamsManager->replaceArgs($linkedParamId, $templateArgs); + $parsedParam = $this->templateParamsManager->parseTemplatedParam($linkedParamId); + if ($parsedParam !== FALSE) { + $linkedParamId = $parsedParam['paramid']; + foreach ($parsedParam['template_args'] as $key => $val) { + $tempArgs[$key] = $val; } - - - public function applyRangesAndIndexes($paramsData, $paramData, $force_total_2d, &$paramInfo) { - $dim1_min = 0; - $dim1_max = 0; - $dim2_min = 0; - $dim2_max = 0; - - $dim1_is_range = (isset($paramData->{'dim1-sum-type'}) && ($paramData->{'dim1-sum-type'} > 0)); - $dim1_index = ($dim1_is_range || !isset($paramData->{'dim1-index'}) || ($paramData->{'dim1-index'} == '')) ? '*' : $paramData->{'dim1-index'}; - if ($dim1_is_range) { - switch ($paramData->{'dim1-sum-type'}) { - case 1: - //Sum between a range of value - $dim1_min = !empty($paramData->{'dim1-min-value'}) ? $paramData->{'dim1-min-value'} : 0; - $dim1_max = !empty($paramData->{'dim1-max-value'}) ? $paramData->{'dim1-max-value'} : 0; - break; - case 2: - //Sum between indexes - $dim1_min = !empty($paramData->{'dim1-min-index'}) ? $paramData->{'dim1-min-index'} : 0; - $dim1_max = !empty($paramData->{'dim1-max-index'}) ? $paramData->{'dim1-max-index'} : 0; - break; - } - } - - $dim2_is_range = (isset($paramData->{'dim2-sum-type'}) && ($paramData->{'dim2-sum-type'} > 0)); - $dim2_index = ($dim2_is_range || !isset($paramData->{'dim2-index'}) || ($paramData->{'dim2-index'} == '')) ? '*' : $paramData->{'dim2-index'}; - if ($dim2_is_range) { - switch ($paramData->{'dim2-sum-type'}) { - case 1: - //Sum between a range of value - $dim2_min = !empty($paramData->{'dim2-min-value'}) ? $paramData->{'dim2-min-value'} : 0; - $dim2_max = !empty($paramData->{'dim2-max-value'}) ? $paramData->{'dim2-max-value'} : 0; - break; - case 2: - //Sum between indexes - $dim2_min = !empty($paramData->{'dim2-min-index'}) ? $paramData->{'dim2-min-index'} : 0; - $dim2_max = !empty($paramData->{'dim2-max-index'}) ? $paramData->{'dim2-max-index'} : 0; - break; - } - } - - switch ($paramData->{'type'}) { - case 0: - //scalar - nothing to do - break; - case 1: - //Tab1D - if ($dim1_is_range) { - $template_args = array( - 'paramid' => $paramInfo['id'], - 'min' => $dim1_min, - 'max' => $dim1_max, - 'relateddim' => 0, - ); - if ($paramData->{'dim1-sum-type'} == 2) - $paramInfo = $this->addExistingParam('sum_into_table_indexes', $paramsData, $template_args); - else - $paramInfo = $this->addExistingParam('sum_into_table_range', $paramsData, $template_args); - } - else if ($dim2_is_range) { - $template_args = array( - 'paramid' => $paramInfo['id'], - 'min' => $dim2_min, - 'max' => $dim2_max, - 'relateddim' => 1, - ); - if ($paramData->{'dim2-sum-type'} == 2) - $paramInfo = $this->addExistingParam('sum_into_table_indexes', $paramsData, $template_args); - else - $paramInfo = $this->addExistingParam('sum_into_table_range', $paramsData, $template_args); - } - else if ($dim1_index != '*') { - $paramInfo['indexes'][] = $dim1_index; - } - else if ($dim2_index != '*') { - $paramInfo['indexes'][] = $dim2_index; - } - break; - case 2: - //Tab2D - if ($dim1_is_range && $dim2_is_range) { - if ($paramData->{'dim1-sum-type'} != $paramData->{'dim2-sum-type'}) { - throw new Exception("Not supported - Dimensions ranges for ".$paramInfo['id']." must have the same type for each dimensions"); - } - $template_args = array( - 'paramid' => $paramInfo['id'], - 'min1' => $dim1_min, - 'max1' => $dim1_max, - 'relateddim1' => 0, - 'min2' => $dim2_min, - 'max2' => $dim2_max, - ); - if ($paramData->{'dim1-sum-type'} == 2) - $paramInfo = $this->addExistingParam('sum_into_table_indexes_2d', $paramsData, $template_args); - else - $paramInfo = $this->addExistingParam('sum_into_table_range_2d', $paramsData, $template_args); - } - else if ($dim1_is_range) { - $template_args = array( - 'paramid' => $paramInfo['id'], - 'min' => $dim1_min, - 'max' => $dim1_max, - 'relateddim' => 0, - ); - $tableLink = array( - 'paramid' => $paramInfo['id'], - 'relateddim' => 1, - ); - if ($paramData->{'dim1-sum-type'} == 2) - $paramInfo = $this->addExistingParam('sum_into_table_indexes', $paramsData, $template_args, $tableLink); - else - $paramInfo = $this->addExistingParam('sum_into_table_range', $paramsData, $template_args, $tableLink); - if ($dim2_index != '*') { - $paramInfo['indexes'][] = $dim2_index; - } - } - else if ($dim2_is_range) { - $template_args = array( - 'paramid' => $paramInfo['id'], - 'min' => $dim2_min, - 'max' => $dim2_max, - 'relateddim' => 1, - ); - $tableLink = array( - 'paramid' => $paramInfo['id'], - 'relateddim' => 0, - ); - if ($paramData->{'dim2-sum-type'} == 2) - $paramInfo = $this->addExistingParam('sum_into_table_indexes', $paramsData, $template_args, $tableLink); - else - $paramInfo = $this->addExistingParam('sum_into_table_range', $paramsData, $template_args, $tableLink); - if ($dim1_index != '*') { - $paramInfo['indexes'][] = $dim1_index; - } - } - else if (($dim1_index != '*') && ($dim2_index != '*')) { - $paramInfo['indexes'][] = "[".$dim1_index.",".$dim2_index."]"; - } - else if ($dim1_index != '*') { - $paramInfo['indexes'][] = "[".$dim1_index.",*]"; - } - else if ($dim2_index != '*') { - $paramInfo['indexes'][] = "[*,".$dim2_index."]"; - } - else if ($force_total_2d) { - //total over 2 dims - $template_args = array( - 'paramid' => $paramInfo['id'], - ); - $paramInfo = $this->addExistingParam('total_2D', $paramsData, $template_args); - } - break; - } - } - - public function parseExpression($expression, $workingDir) { - $outputFileName = "parser_".md5($expression).".xml"; - if (array_key_exists($outputFileName, $this->cacheExpressionParser)) { - return $this->cacheExpressionParser[$outputFileName]; - } - $parserData = new ParserRequestDataClass(); - $parserData->setManagerFilePath(IHMConfigClass::getProcessManagerFilePath()); - $parserData->addExpression($expression); - $parserData->setWorkingPath($workingDir); - $parserData->setLocalParamsPath(IHMConfigClass::getLocalParamDBPath()); - $parserData->setConstantsFilePath(IHMConfigClass::getConstantsFilePath()); - $parserData->setFunctionsFilePath(IHMConfigClass::getFunctionsFilePath()); - $parserData->setParamTemplatesFilePath(IHMConfigClass::getParamTemplateListFilePath()); - $parserData->setFunctionsArgsListFilePath(IHMConfigClass::getFunctionsArgsListFilePath()); - $parserData->setOutputFileName($outputFileName); - $resultFilePath = $workingDir."/".$outputFileName; - - $parserRequest = new ParserRequestClass(); - $parserRequest->setData($parserData); - - if (!$parserRequest->init() || !$parserRequest->run()) { - if (file_exists($resultFilePath)) { - unlink($resultFilePath); - } - return array('success' => FALSE, 'message' => 'Error to init or run expression parser'); - } - - //Load result file - $doc = new DOMDocument(); - $doc->load($resultFilePath); - if (!$doc->load($resultFilePath)) { - if (file_exists($resultFilePath)) { - unlink($resultFilePath); - } - return array('success' => FALSE, 'message' => 'Error to load parser result file'); - } - - $expressionNodes = $doc->getElementsByTagName('expression'); - if ($expressionNodes->length == 0) { - unlink($resultFilePath); - return array('success' => FALSE, 'message' => 'Cannot get expression nodes in parser result file'); - } - - $crtExpressionNode = NULL; - foreach ($expressionNodes as $expressionNode) { - $ihmExpressionNodes = $expressionNode->getElementsByTagName('ihm'); - if ($ihmExpressionNodes->length == 0) { - continue; - } - if ($ihmExpressionNodes->item(0)->nodeValue == $expression) { - $crtExpressionNode = $expressionNode; - break; - } - } - - if (!isset($crtExpressionNode)) { - unlink($resultFilePath); - return array('success' => FALSE, 'message' => 'Cannot retrieve expression in parser result file'); - } - - if ($crtExpressionNode->getAttribute('success') != "true") { - unlink($resultFilePath); - return array('success' => FALSE, 'message' => 'Synthax error in expression '.$expression); - } - - $kernelExpressionNodes = $crtExpressionNode->getElementsByTagName('kernel'); - if ($kernelExpressionNodes->length == 0) { - unlink($resultFilePath); - return array('success' => FALSE, 'message' => 'Cannot retrieve kernel expression in parser result file'); - } - - $kernelExpression = $kernelExpressionNodes->item(0)->nodeValue; - - if (empty($kernelExpression)) { - unlink($resultFilePath); - return array('success' => FALSE, 'message' => 'Parser return an empty expression'); - } - - $params = array(); - $paramsNodes = $crtExpressionNode->getElementsByTagName('params'); - if ($paramsNodes->length != 0) { - $paramNodes = $paramsNodes->item(0)->getElementsByTagName('param'); - if ($paramNodes->length != 0) { - foreach ($paramNodes as $paramNode) { - if (!empty($paramNode->nodeValue)) { - $params[] = array( - 'paramid' => $paramNode->nodeValue - ); - } - } - } - } - - unlink($resultFilePath); - - if (empty($params)) { - return array('success' => FALSE, 'message' => 'Expression should contain at least one parameter'); - } - - foreach ($params as &$param) { - $templated_param = $this->templateParamsManager->parseTemplatedParam($param['paramid']); - if ($templated_param !== FALSE) { - $param = $templated_param; - } - } - - $this->cacheExpressionParser[$outputFileName] = array('success' => TRUE, 'expression' => $kernelExpression, 'params' => $params); - return $this->cacheExpressionParser[$outputFileName]; - } - - public function getTemplateParamsManager() { - return $this->templateParamsManager; - } + } + } + + if ($this->templateParamsManager->isTemplatedParam($linkedParamId)) { + $linkedParamPath = $this->templateParamsManager->generateTemplatedParamFile($linkedParamId, $tempArgs); + $real_linked_param_id = $this->templateParamsManager->getTemplatedParamId($linkedParamId, $tempArgs); + } else { + $real_linked_param_id = $linkedParamId; + $linkedParamPath = IHMConfigClass::getLocalParamDBPath() . $real_linked_param_id . ".xml"; + } + $paramsData->addParamToCopy($real_linked_param_id, $linkedParamPath); + $this->addLinkedLocalParams($linkedParamId, $paramsData); + } + } + + /* + * @brief Add derived parameter + */ + + private function addDerivedParam($param, $paramsData) { + $time = time(); + if (!isset($this->userParameterMgr)) + $this->userParameterMgr = new IHMUserParamManagerClass(); + + //get derived parameter info + $res = $this->userParameterMgr->getDerivedParameterFromName($param); + + if (!$res["success"]) + throw new Exception('Error to load derived parameter file : ' . $res["message"]); + + if (isset($res["param"]["info"]["parsedExpression"])) { + //Re use existing parsed expression info + $expressionInfo = $res["param"]["info"]["parsedExpression"]; + } else { + //parse expression + $expressionInfo = $this->parseExpression($res["param"]["expression"], $paramsData->getWorkingPath()); + + if (!$expressionInfo['success']) { + throw new Exception($expressionInfo['message']); + } + + $paramsList = array(); + foreach ($expressionInfo['params'] as $p) { + $paramsList[] = $p["paramid"]; + } + $this->userParameterMgr->saveDerivedParameterParsedExpression($res["param"]["id"], $expressionInfo["expression"], md5($res["param"]["expression"]), $paramsList); + } + + $paramId = $param; + + //create a process param for the derived parameter + $this->addProcessParam($paramId, $expressionInfo["expression"], $res["param"]["expression"], $expressionInfo['params'], $res["param"]["info"]["sampling_mode"], $res["param"]["info"]["timestep"], $res["param"]["info"]["reference_param"], 0, $res["param"]["dateModif"], !empty($res["param"]["info"]["units"]) ? $res["param"]["info"]["units"] : "", !empty($res["param"]["info"]["yTitle"]) ? $res["param"]["info"]["yTitle"] : "", $paramsData); + + return array("id" => $paramId, "indexes" => array(), "calib_infos" => array()); + } + + /* + * @brief Add IMPEX parameter : create dynamically xml parameter descriptor in user WS + */ + + private function addImpexParam($param, $paramsData, $templateArgs = NULL) { + if (!isset($this->paramImpexMgr)) + $this->paramImpexMgr = new ImpexParamManager(); + + $parameterID = $this->paramImpexMgr->getImpexFullParamId($param, $templateArgs); + + $requestNodes = $paramsData->getRequestNodes(); + + // it is PARAMSGEN + if (!$requestNodes) { + return array("id" => $parameterID); + } + + $timesNode = $requestNodes[0]->getTimesNode(); + $intervals = $timesNode->getIntervals(); + $originFile = IHMConfigClass::getUserWSPath() . $parameterID . ".xml"; + + if (!file_exists($originFile)) { + // create IMPEX parameter info and data + $res = $this->paramImpexMgr->createImpexParameter($param, $intervals, $templateArgs); + + if (!$res["success"]) + throw new Exception('Error to create IMPEX parameter : ' . $res["message"]); + + $newParamNode = $paramsData->addLocalParamToCreate($res["param"]["id"], $res["param"]["info"]["viId"], $res["param"]["info"]["realVar"], $res["param"]["info"]["minSampling"], $res["param"]["info"]["maxSampling"], $res["param"]["info"]["type"], $res["param"]["info"]["size"], NULL, $res["param"]["dateModif"], true); + + $newParamNode->getInfo()->setName($res["param"]["info"]['name']); + $newParamNode->getInfo()->setShortName($res["param"]["info"]['name']); + $newParamNode->getInfo()->setUnits($res["param"]["info"]['units']); + + $tableDef = $res["param"]["info"]["tableDef"]; + if (isset($tableDef) && array_key_exists('tableDefType', $tableDef) && ($tableDef['tableDefType'] != 'NONE')) { + switch ($tableDef['channelsDefType']) { + case 'BOUND' : + $boundTable = $newParamNode->getInfo()->addTable(InfoParamTableTypeEnum::BOUNDS, $res["param"]["info"]["yTitle"]); + $boundTable->setUnits($res["param"]["info"]["yUnits"]); + switch ($tableDef['tableDefType']) { + case 'SELECT' : + $boundTable->setBoundsName($tableDef['data']['bound']); + $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['bound']); + break; + default : + throw new Exception("Unknown tableDefType " . $tableDef['tableDefType']); + } + break; + case 'CENTER' : + $centerTable = $newParamNode->getInfo()->addTable(InfoParamTableTypeEnum::CENTER, $res["param"]["info"]["yTitle"]); + $centerTable->setUnits($res["param"]["info"]["yUnits"]); + $centerTable->setSize($tableDef['data']['width']); + switch ($tableDef['tableDefType']) { + case 'SELECT' : + $centerTable->setCenterName($tableDef['data']['center']); + $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['center']); + break; + default : + throw new Exception("Unknown tableDefType " . $tableDef['tableDefType']); + } + break; + default : + throw new Exception("Unknown tableDefType " . $tableDef['channelsDefType']); + } + } + + return array("id" => $res["param"]["id"], "plotType" => $res["param"]["info"]["plotType"]); + } else { + // add IMPEX parameter data + $this->paramImpexMgr->addImpexData($param, $intervals, $templateArgs); + $paramsData->addParamToCopy($parameterID, $originFile); + + return array("id" => $parameterID); + } + } + + /* + * @brief Add uploaded parameter + */ + + private function addUploadedParam($param, $paramsData) { + if (!isset($this->userParameterMgr)) + $this->userParameterMgr = new IHMUserParamManagerClass(); + + //get uploaded parameter info + $res = $this->userParameterMgr->getUploadedParameterFromName($param); + + if (!$res["success"]) + throw new Exception('Error to load uploaded parameter file : ' . $res["message"]); + + $paramId = $param; + + $newParamNode = $paramsData->addLocalParamToCreate($paramId, $res["param"]["info"]["viId"], $res["param"]["info"]["realVar"], $res["param"]["info"]["minSampling"], $res["param"]["info"]["maxSampling"], $res["param"]["info"]["type"], $res["param"]["info"]["size"], $res["param"]["info"]["fillValue"], $res["param"]["dateModif"]); + + if (!empty($res["param"]["info"]["yTitle"])) { + $newParamNode->getInfo()->setName($res["param"]["info"]['yTitle']); + $newParamNode->getInfo()->setShortName($res["param"]["info"]['yTitle']); + } + if (!empty($res["param"]["info"]['units'])) { + $newParamNode->getInfo()->setUnits($res["param"]["info"]['units']); + } + + + $tableDef = $res["param"]["info"]["tableDef"]; + if (isset($tableDef) && array_key_exists('tableDefType', $tableDef) && ($tableDef['tableDefType'] != 'NONE')) { + $tableName = empty($tableDef['tableName']) ? 'Table' : $tableDef['tableName']; + $tableUnits = empty($tableDef['tableUnits']) ? '' : $tableDef['tableUnits']; + switch ($tableDef['channelsDefType']) { + case 'MINMAX' : + $minMaxTable = $newParamNode->getInfo()->addTable(InfoParamTableTypeEnum::MINMAX, $tableName); + $minMaxTable->setUnits($tableUnits); + switch ($tableDef['tableDefType']) { + case 'SELECT' : + $minMaxTable->setMinName($tableDef['data']['min']); + $minMaxTable->setMaxName($tableDef['data']['max']); + $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['min']); + $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['max']); + break; + case 'MANUAL' : + $minMaxTable->setMinName('min'); + $minMaxTable->setMaxName('max'); + $clbMinNode = $newParamNode->addClbManual('min'); + $clbMinValues = explode(',', $tableDef['data']['min']); + foreach ($clbMinValues as $value) + $clbMinNode->addClbValue($value); + $clbMaxNode = $newParamNode->addClbManual('max'); + $clbMaxValues = explode(',', $tableDef['data']['max']); + foreach ($clbMaxValues as $value) + $clbMaxNode->addClbValue($value); + break; + } + break; + case 'BOUND' : + $boundTable = $newParamNode->getInfo()->addTable(InfoParamTableTypeEnum::BOUNDS, $tableName); + $boundTable->setUnits($tableUnits); + switch ($tableDef['tableDefType']) { + case 'SELECT' : + $boundTable->setBoundsName($tableDef['data']['bound']); + $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['bound']); + break; + case 'MANUAL' : + $boundTable->setBoundsName('bound'); + $clbBoundNode = $newParamNode->addClbManual('bound'); + $clbBoundValues = explode(',', $tableDef['data']['bound']); + foreach ($clbBoundValues as $value) + $clbBoundNode->addClbValue($value); + break; + } + break; + case 'CENTER' : + $centerTable = $newParamNode->getInfo()->addTable(InfoParamTableTypeEnum::CENTER, $tableName); + $centerTable->setUnits($tableUnits); + $centerTable->setSize($tableDef['data']['width']); + switch ($tableDef['tableDefType']) { + case 'SELECT' : + $centerTable->setCenterName($tableDef['data']['center']); + $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['center']); + break; + case 'MANUAL' : + $centerTable->setCenterName('center'); + $clbCenterNode = $newParamNode->addClbManual('center'); + $clbCenterValues = explode(',', $tableDef['data']['center']); + foreach ($clbCenterValues as $value) + $clbCenterNode->addClbValue($value); + break; + } + break; + case 'CENTERWIDTH' : + $centerWidthTable = $newParamNode->getInfo()->addTable(InfoParamTableTypeEnum::CENTERWIDTH, $tableName); + $centerWidthTable->setUnits($tableUnits); + switch ($tableDef['tableDefType']) { + case 'SELECT' : + $centerWidthTable->setCenterName($tableDef['data']['center']); + $centerWidthTable->setWidthName($tableDef['data']['width']); + $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['center']); + $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['width']); + break; + case 'MANUAL' : + $centerWidthTable->setCenterName('center'); + $centerWidthTable->setWidthName('width'); + $clbCenterNode = $newParamNode->addClbManual('center'); + $clbWidthNode = $newParamNode->addClbManual('width'); + $clbCenterValues = explode(',', $tableDef['data']['center']); + foreach ($clbCenterValues as $value) + $clbCenterNode->addClbValue($value); + $clbWidthValues = explode(',', $tableDef['data']['width']); + foreach ($clbWidthValues as $value) + $clbWidthNode->addClbValue($value); + break; + } + break; + } + } + + return array("id" => $paramId, "plotType" => $res["param"]["info"]["plotType"]); + } + + public function applyFilter($paramsData, $paramData, &$paramInfo) { + $filter = (isset($paramData->{'param-drawing-object'}->{'filtering-activated'}) && ($paramData->{'param-drawing-object'}->{'filtering-activated'})) ? true : false; + if (!$filter) { + return; + } + $my_type = $paramData->{'type'}; + + switch ($paramData->{'type'}) { + case 0: + case 1: + // vector + $dim1_index = ($dim1_is_range || !isset($paramData->{'dim1-index'}) || ($paramData->{'dim1-index'} == '')) ? '*' : $paramData->{'dim1-index'}; + $dim2_index = ($dim2_is_range || !isset($paramData->{'dim2-index'}) || ($paramData->{'dim2-index'} == '')) ? '*' : $paramData->{'dim2-index'}; + if (isset($paramData->{'param-drawing-object'}->{'filtering-level'})) { + switch ($paramData->{'param-drawing-object'}->{'filtering-level'}) { + case 1: + $factor = 6; + $nPoints = 100; + $level="low"; + break; + case 2: + $factor = 5; + $nPoints = 100; + $level="medium"; + break; + case 3: + $factor = 4; + $nPoints = 100; + $level="strong"; + break; + default: + $factor = 6; + $nPoints = 100; + $level="low"; + } + } else { + $factor = 5; + $nPoints = 100; + } + + if ($dim1_index != '*') { + $template_args = array( + 'paramid' => $paramInfo['id'], + 'factor' => $factor, + 'nPoints' => $nPoints, + 'index' => $dim1_index, + 'level' => $level + ); + $paramInfo = $this->addExistingParam('filter_spikes_component', $paramsData, $template_args); + } else { + $template_args = array( + 'paramid' => $paramInfo['id'], + 'factor' => $factor, + 'nPoints' => $nPoints, + 'level' => $level + ); + $paramInfo = $this->addExistingParam('filter_spikes', $paramsData, $template_args); + } + break; + case 2: + return array('success' => FALSE, 'message' => '2D Table filtering not implémented yet'); + } + } + + public function applyRangesAndIndexes($paramsData, $paramData, $force_total_2d, &$paramInfo) { + $dim1_min = 0; + $dim1_max = 0; + $dim2_min = 0; + $dim2_max = 0; + + $dim1_is_range = (isset($paramData->{'dim1-sum-type'}) && ($paramData->{'dim1-sum-type'} > 0)); + $dim1_index = ($dim1_is_range || !isset($paramData->{'dim1-index'}) || ($paramData->{'dim1-index'} == '')) ? '*' : $paramData->{'dim1-index'}; + if ($dim1_is_range) { + switch ($paramData->{'dim1-sum-type'}) { + case 1: + //Sum between a range of value + $dim1_min = !empty($paramData->{'dim1-min-value'}) ? $paramData->{'dim1-min-value'} : 0; + $dim1_max = !empty($paramData->{'dim1-max-value'}) ? $paramData->{'dim1-max-value'} : 0; + break; + case 2: + //Sum between indexes + $dim1_min = !empty($paramData->{'dim1-min-index'}) ? $paramData->{'dim1-min-index'} : 0; + $dim1_max = !empty($paramData->{'dim1-max-index'}) ? $paramData->{'dim1-max-index'} : 0; + break; + } + } + + $dim2_is_range = (isset($paramData->{'dim2-sum-type'}) && ($paramData->{'dim2-sum-type'} > 0)); + $dim2_index = ($dim2_is_range || !isset($paramData->{'dim2-index'}) || ($paramData->{'dim2-index'} == '')) ? '*' : $paramData->{'dim2-index'}; + if ($dim2_is_range) { + switch ($paramData->{'dim2-sum-type'}) { + case 1: + //Sum between a range of value + $dim2_min = !empty($paramData->{'dim2-min-value'}) ? $paramData->{'dim2-min-value'} : 0; + $dim2_max = !empty($paramData->{'dim2-max-value'}) ? $paramData->{'dim2-max-value'} : 0; + break; + case 2: + //Sum between indexes + $dim2_min = !empty($paramData->{'dim2-min-index'}) ? $paramData->{'dim2-min-index'} : 0; + $dim2_max = !empty($paramData->{'dim2-max-index'}) ? $paramData->{'dim2-max-index'} : 0; + break; + } + } + + switch ($paramData->{'type'}) { + case 0: + //scalar - nothing to do + break; + case 1: + //Tab1D + if ($dim1_is_range) { + $template_args = array( + 'paramid' => $paramInfo['id'], + 'min' => $dim1_min, + 'max' => $dim1_max, + 'relateddim' => 0, + ); + if ($paramData->{'dim1-sum-type'} == 2) + $paramInfo = $this->addExistingParam('sum_into_table_indexes', $paramsData, $template_args); + else + $paramInfo = $this->addExistingParam('sum_into_table_range', $paramsData, $template_args); + } + else if ($dim2_is_range) { + $template_args = array( + 'paramid' => $paramInfo['id'], + 'min' => $dim2_min, + 'max' => $dim2_max, + 'relateddim' => 1, + ); + if ($paramData->{'dim2-sum-type'} == 2) + $paramInfo = $this->addExistingParam('sum_into_table_indexes', $paramsData, $template_args); + else + $paramInfo = $this->addExistingParam('sum_into_table_range', $paramsData, $template_args); + } + else if ($dim1_index != '*') { + $paramInfo['indexes'][] = $dim1_index; + } else if ($dim2_index != '*') { + $paramInfo['indexes'][] = $dim2_index; + } + break; + case 2: + //Tab2D + if ($dim1_is_range && $dim2_is_range) { + if ($paramData->{'dim1-sum-type'} != $paramData->{'dim2-sum-type'}) { + throw new Exception("Not supported - Dimensions ranges for " . $paramInfo['id'] . " must have the same type for each dimensions"); + } + $template_args = array( + 'paramid' => $paramInfo['id'], + 'min1' => $dim1_min, + 'max1' => $dim1_max, + 'relateddim1' => 0, + 'min2' => $dim2_min, + 'max2' => $dim2_max, + ); + if ($paramData->{'dim1-sum-type'} == 2) + $paramInfo = $this->addExistingParam('sum_into_table_indexes_2d', $paramsData, $template_args); + else + $paramInfo = $this->addExistingParam('sum_into_table_range_2d', $paramsData, $template_args); + } + else if ($dim1_is_range) { + $template_args = array( + 'paramid' => $paramInfo['id'], + 'min' => $dim1_min, + 'max' => $dim1_max, + 'relateddim' => 0, + ); + $tableLink = array( + 'paramid' => $paramInfo['id'], + 'relateddim' => 1, + ); + if ($paramData->{'dim1-sum-type'} == 2) + $paramInfo = $this->addExistingParam('sum_into_table_indexes', $paramsData, $template_args, $tableLink); + else + $paramInfo = $this->addExistingParam('sum_into_table_range', $paramsData, $template_args, $tableLink); + if ($dim2_index != '*') { + $paramInfo['indexes'][] = $dim2_index; + } + } else if ($dim2_is_range) { + $template_args = array( + 'paramid' => $paramInfo['id'], + 'min' => $dim2_min, + 'max' => $dim2_max, + 'relateddim' => 1, + ); + $tableLink = array( + 'paramid' => $paramInfo['id'], + 'relateddim' => 0, + ); + if ($paramData->{'dim2-sum-type'} == 2) + $paramInfo = $this->addExistingParam('sum_into_table_indexes', $paramsData, $template_args, $tableLink); + else + $paramInfo = $this->addExistingParam('sum_into_table_range', $paramsData, $template_args, $tableLink); + if ($dim1_index != '*') { + $paramInfo['indexes'][] = $dim1_index; + } + } else if (($dim1_index != '*') && ($dim2_index != '*')) { + $paramInfo['indexes'][] = "[" . $dim1_index . "," . $dim2_index . "]"; + } else if ($dim1_index != '*') { + $paramInfo['indexes'][] = "[" . $dim1_index . ",*]"; + } else if ($dim2_index != '*') { + $paramInfo['indexes'][] = "[*," . $dim2_index . "]"; + } else if ($force_total_2d) { + //total over 2 dims + $template_args = array( + 'paramid' => $paramInfo['id'], + ); + $paramInfo = $this->addExistingParam('total_2D', $paramsData, $template_args); + } + break; + } + } + + public function parseExpression($expression, $workingDir) { + $outputFileName = "parser_" . md5($expression) . ".xml"; + if (array_key_exists($outputFileName, $this->cacheExpressionParser)) { + return $this->cacheExpressionParser[$outputFileName]; + } + $parserData = new ParserRequestDataClass(); + $parserData->setManagerFilePath(IHMConfigClass::getProcessManagerFilePath()); + $parserData->addExpression($expression); + $parserData->setWorkingPath($workingDir); + $parserData->setLocalParamsPath(IHMConfigClass::getLocalParamDBPath()); + $parserData->setConstantsFilePath(IHMConfigClass::getConstantsFilePath()); + $parserData->setFunctionsFilePath(IHMConfigClass::getFunctionsFilePath()); + $parserData->setParamTemplatesFilePath(IHMConfigClass::getParamTemplateListFilePath()); + $parserData->setFunctionsArgsListFilePath(IHMConfigClass::getFunctionsArgsListFilePath()); + $parserData->setOutputFileName($outputFileName); + $resultFilePath = $workingDir . "/" . $outputFileName; + + $parserRequest = new ParserRequestClass(); + $parserRequest->setData($parserData); + + if (!$parserRequest->init() || !$parserRequest->run()) { + if (file_exists($resultFilePath)) { + unlink($resultFilePath); + } + return array('success' => FALSE, 'message' => 'Error to init or run expression parser'); + } + + //Load result file + $doc = new DOMDocument(); + $doc->load($resultFilePath); + if (!$doc->load($resultFilePath)) { + if (file_exists($resultFilePath)) { + unlink($resultFilePath); + } + return array('success' => FALSE, 'message' => 'Error to load parser result file'); + } + + $expressionNodes = $doc->getElementsByTagName('expression'); + if ($expressionNodes->length == 0) { + unlink($resultFilePath); + return array('success' => FALSE, 'message' => 'Cannot get expression nodes in parser result file'); + } + + $crtExpressionNode = NULL; + foreach ($expressionNodes as $expressionNode) { + $ihmExpressionNodes = $expressionNode->getElementsByTagName('ihm'); + if ($ihmExpressionNodes->length == 0) { + continue; + } + if ($ihmExpressionNodes->item(0)->nodeValue == $expression) { + $crtExpressionNode = $expressionNode; + break; + } + } + + if (!isset($crtExpressionNode)) { + unlink($resultFilePath); + return array('success' => FALSE, 'message' => 'Cannot retrieve expression in parser result file'); + } + + if ($crtExpressionNode->getAttribute('success') != "true") { + unlink($resultFilePath); + return array('success' => FALSE, 'message' => 'Synthax error in expression ' . $expression); + } + + $kernelExpressionNodes = $crtExpressionNode->getElementsByTagName('kernel'); + if ($kernelExpressionNodes->length == 0) { + unlink($resultFilePath); + return array('success' => FALSE, 'message' => 'Cannot retrieve kernel expression in parser result file'); + } + + $kernelExpression = $kernelExpressionNodes->item(0)->nodeValue; + + if (empty($kernelExpression)) { + unlink($resultFilePath); + return array('success' => FALSE, 'message' => 'Parser return an empty expression'); + } + + $params = array(); + $paramsNodes = $crtExpressionNode->getElementsByTagName('params'); + if ($paramsNodes->length != 0) { + $paramNodes = $paramsNodes->item(0)->getElementsByTagName('param'); + if ($paramNodes->length != 0) { + foreach ($paramNodes as $paramNode) { + if (!empty($paramNode->nodeValue)) { + $params[] = array( + 'paramid' => $paramNode->nodeValue + ); + } + } + } + } + + unlink($resultFilePath); + + if (empty($params)) { + return array('success' => FALSE, 'message' => 'Expression should contain at least one parameter'); + } + + foreach ($params as &$param) { + $templated_param = $this->templateParamsManager->parseTemplatedParam($param['paramid']); + if ($templated_param !== FALSE) { + $param = $templated_param; + } + } + + $this->cacheExpressionParser[$outputFileName] = array('success' => TRUE, 'expression' => $kernelExpression, 'params' => $params); + return $this->cacheExpressionParser[$outputFileName]; + } + + public function getTemplateParamsManager() { + return $this->templateParamsManager; + } + } -- libgit2 0.21.2