Commit 96fa912db33d9481600fa16877252e6f9cf30717

Authored by Hacene SI HADJ MOHAND
1 parent e925e409

ihm level instead of values

Showing 1 changed file with 827 additions and 841 deletions   Show diff stats
src/InputOutput/IHMImpl/Tools/IHMParamManagerClass.php
... ... @@ -5,846 +5,832 @@
5 5 * @brief Parameter manager
6 6 * @details
7 7 */
8   -class IHMParamManagerClass
9   -{
10   - protected $userParameterMgr = null;
11   - protected $templateParamsManager = null;
12   - protected $paramImpexMgr = null;
13   - protected $ttCatMgr = null;
14   -
15   - protected $cacheExpressionParser = null;
16   -
17   - /*
18   - * @brief Constructor
19   - */
20   - function __construct()
21   - {
22   - $this->templateParamsManager = new IHMParamTemplateClass();
23   - $this->cacheExpressionParser = array();
24   - }
25   -
26   - public function addGeneratedParam($paramId, $expression, $sampling_mode, $sampling_step, $ref_param, $paramsData)
27   - {
28   - $expressionInfo = $this->parseExpression($expression, $paramsData->getWorkingPath());
29   - if (!$expressionInfo['success']) {
30   - throw new Exception($expressionInfo['message']);
31   - }
32   -
33   - //create a process param for the derived parameter
34   - $this->addProcessParam($paramId, $expressionInfo["expression"], $expression,
35   - $expressionInfo['params'], $sampling_mode, $sampling_step, $ref_param,
36   - 0, time(), "", "", $paramsData);
37   - }
38   -
39   - /*
40   - * @brief Add an existing parameter
41   - */
42   - public function addExistingParam($param, $paramsData, $templateArgs = NULL, $tableLink = NULL)
43   - {
44   - if ($this->isDerivedParam($param))
45   - return $this->addDerivedParam($param,$paramsData);
46   - else if ($this->isUploadedParam($param))
47   - return $this->addUploadedParam($param,$paramsData);
48   - else if ($this->isImpexParam($param))
49   - return $this->addImpexParam($param,$paramsData,$templateArgs);
50   - else
51   - return $this->addLocalParam($param,$paramsData,$templateArgs, $tableLink);
52   - return "";
53   - }
54   -
55   - /*
56   - * @brief Add a process parameter
57   - */
58   - public function addProcessParam($paramId,$expression,$expression_info,$params, $sampling_mode, $sampling_step, $ref_param, $gap,$dateModif,$units,$ytitle,$paramsData)
59   - {
60   - $paramsData->addProcessParamToCreate($paramId, $expression, $expression_info, $params, $sampling_mode, $sampling_step, $ref_param, $gap,$dateModif, $units, $ytitle);
61   -
62   - foreach ($params as $param) {
63   - $template_args = NULL;
64   -
65   - if (array_key_exists("template_args", $param))
66   - $template_args = $param["template_args"];
67   -
68   - $this->addExistingParam($param["paramid"],$paramsData,$template_args);
69   - }
70   - if (!empty($ref_param)) {
71   - $this->addExistingParam($ref_param, $paramsData,$template_args);
72   - }
73   -
74   - return true;
75   - }
76   -
77   - /*
78   - * @brief Add a TT or catalog parameter
79   - */
80   - public function addTTCatParam($paramId, $paramsData)
81   - {
82   - if (!isset($this->ttCatMgr)) {
83   - $this->ttCatMgr = new IHMTTCatLoaderClass();
84   - }
85   - $info = $this->ttCatMgr->getTTCatInfoFromId($paramId);
86   -
87   - if (!$info["success"]) {
88   - throw new Exception($info["message"]);
89   - }
90   -
91   - $status = array();
92   - $units = "";
93   - $ytitle = "";
94   - $flag = "";
95   -
96   - if ($info["info"]["isCatalog"]) {
97   - $parameters = $this->ttCatMgr->getCatalogParameters($paramId);
98   - if (!$parameters["success"] || empty($parameters["parameters"])) {
99   - throw new Exception("Error to extract first parameter of ".$paramId);
100   - }
101   - //For the moment, use the first parameter
102   - $parameter = $parameters["parameters"][0];
103   - $units = $parameter["units"];
104   - $ytitle = !empty($parameter["name"]) ? $parameter["name"] : $parameter["id"];
105   - $flag = $parameter["id"];
106   - $description = $parameter["description"];
107   - $desc_parts = array();
108   - foreach (explode("-",$description) as $def) {
109   - $def = trim($def);
110   - $p = strpos($def, ":");
111   - if ($p === FALSE) {
112   - continue;
113   - }
114   - $val = substr($def, 0, $p);
115   - $val = trim($val);
116   - $name = substr($def, $p+1);
117   - $name = trim($name);
118   - $color = "";
119   - $p = strpos($name, "[");
120   - if ($p !== FALSE) {
121   - $color = substr($name, $p);
122   - $color = trim($color);
123   - $name = substr($name, 0, $p);
124   - $name = trim($name);
125   - }
126   - $status[] = array(
127   - "min" => floatval($val),
128   - "max" => floatval($val),
129   - "name" => $name,
130   - "color" => $color,
131   - );
132   - }
133   - }
134   - else {
135   - $status = array(
136   - array(
137   - "min" => 1,
138   - "max" => 1,
139   - "name" => "Inside",
140   - "color" => "[255,0,0]",
141   - )
142   - );
143   - $ytitle = $info["info"]["name"];
144   - }
145   -
146   - $paramsData->addTTCatParamToCreate($paramId, $info["info"]["path"], $info["info"]["isShared"], filemtime($info["info"]["path"]), $units, $ytitle, $status, $flag);
147   - return array("id" => $paramId, "indexes" => array(), "calib_infos" => array());
148   - }
149   -
150   - /*
151   - * @brief Detect if it's a derived parameter
152   - */
153   - private function isDerivedParam($param)
154   - {
155   - return preg_match("#^ws_#",$param);
156   - }
157   -
158   - /*
159   - * @brief Detect if it's a uploaded parameter
160   - */
161   - public function isUploadedParam($param)
162   - {
163   - return preg_match("#^wsd_#",$param);
164   - }
165   -
166   - /*
167   - * @brief Detect if it's IMPEX parameter
168   - */
169   - private function isImpexParam($param)
170   - {
171   - return preg_match("#^".IHMImpexParamClass::$paramPrefix."#",$param);
172   - }
173   -
174   - /*
175   - * @brief Add a local parameter
176   - */
177   - private function addLocalParam($param, $paramsData, $templateArgs, $tableLink)
178   - {
179   - //local parameter
180   - $indexes = array();
181   - $calib_infos = array();
182   - //check for components
183   - $pattern = "/(?P<param>.*)\((?P<components>.*)\)/";
184   - preg_match_all($pattern, $param, $matches);
185   - if ((count($matches["param"]) > 0) && (count($matches["components"]) > 0))
186   - {
187   - $paramId = $matches["param"][0];
188   - $indexes = explode(",",$matches["components"][0]);
189   - }
190   - else
191   - $paramId = $param;
192   -
193   - //check templated parameter
194   - $real_param_id = $paramId;
195   - $paramPath = "";
196   - if ($this->templateParamsManager->isTemplatedParam($paramId)) {
197   - $paramPath = $this->templateParamsManager->generateTemplatedParamFile($paramId, $templateArgs, $tableLink);
198   - $real_param_id = $this->templateParamsManager->getTemplatedParamId($paramId, $templateArgs);
199   - if (empty($paramPath) || !file_exists($paramPath))
200   - throw new Exception('Cannot generate parameter template file '.$paramId);
201   - }
202   - else {
203   - $paramPath = IHMConfigClass::getLocalParamDBPath().$paramId.".xml";
204   - if (!file_exists($paramPath))
205   - throw new Exception('Cannot find parameter local file '.$paramId);
206   - }
207   -
208   - $paramsData->addParamToCopy($real_param_id,$paramPath);
209   -
210   - $this->addLinkedLocalParams($paramId, $paramsData, $templateArgs);
211   -
212   - return array("id" => $real_param_id, "indexes" => $indexes, "calib_infos" => $calib_infos, "path" => $paramPath);
213   - }
214   -
215   - /*
216   - * @brief Add linked parameter
217   - */
218   - private function addLinkedLocalParams($paramId,$paramsData,$templateArgs = NULL)
219   - {
220   - $doc = new DOMDocument("1.0", "UTF-8");
221   - $doc->preserveWhiteSpace = false;
222   - $doc->formatOutput = true;
223   -
224   - $real_param_id = $paramId;
225   - if ($this->templateParamsManager->isTemplatedParam($paramId)) {
226   - $paramPath = $this->templateParamsManager->getTemplatePath($paramId);
227   - if (empty($paramPath) || !@$doc->load($paramPath))
228   - throw new Exception('Cannot find parameter template file '.$paramId);
229   - }
230   - else {
231   - $paramPath = IHMConfigClass::getLocalParamDBPath().$paramId.".xml";
232   - if (empty($paramPath) || !@$doc->load($paramPath))
233   - throw new Exception('Cannot find parameter local file '.$paramId);
234   - }
235   -
236   - //<get>
237   - $getNodes = $doc->getElementsByTagName('get');
238   -
239   - if ($getNodes->length <= 0)
240   - throw new Exception('Parameter local file '.$paramId.' dont have a getter node');
241   -
242   - $getNode = $getNodes->item(0);
243   -
244   - //<amdaParam name="imf"/>
245   - $amdaParamNodes = $doc->getElementsByTagName('amdaParam');
246   -
247   - foreach($amdaParamNodes as $amdaParamNode)
248   - {
249   - $linkedParamId = $amdaParamNode->getAttribute('name');
250   - if (empty($linkedParamId))
251   - continue;
252   - $template_id = $this->templateParamsManager->getTemplateId($linkedParamId);
253   - $tempArgs = isset($templateArgs) ? $templateArgs : array();
254   - if ($template_id !== FALSE) {
255   - $linkedParamId = $template_id;
256   - }
257   - else {
258   - $linkedParamId = $this->templateParamsManager->replaceArgs($linkedParamId, $templateArgs);
259   - $parsedParam = $this->templateParamsManager->parseTemplatedParam($linkedParamId);
260   - if ($parsedParam !== FALSE) {
261   - $linkedParamId = $parsedParam['paramid'];
262   - foreach ($parsedParam['template_args'] as $key => $val) {
263   - $tempArgs[$key] = $val;
264   - }
265   - }
266   - }
267   -
268   - if ($this->templateParamsManager->isTemplatedParam($linkedParamId)) {
269   - $linkedParamPath = $this->templateParamsManager->generateTemplatedParamFile($linkedParamId, $tempArgs);
270   - $real_linked_param_id = $this->templateParamsManager->getTemplatedParamId($linkedParamId, $tempArgs);
271   - }
272   - else {
273   - $real_linked_param_id = $linkedParamId;
274   - $linkedParamPath = IHMConfigClass::getLocalParamDBPath().$real_linked_param_id.".xml";
275   - }
276   - $paramsData->addParamToCopy($real_linked_param_id,$linkedParamPath);
277   - $this->addLinkedLocalParams($linkedParamId, $paramsData);
278   - }
279   - }
280   -
281   - /*
282   - * @brief Add derived parameter
283   - */
284   - private function addDerivedParam($param,$paramsData)
285   - {
286   - $time = time();
287   - if (!isset($this->userParameterMgr))
288   - $this->userParameterMgr = new IHMUserParamManagerClass();
289   -
290   - //get derived parameter info
291   - $res = $this->userParameterMgr->getDerivedParameterFromName($param);
292   -
293   - if (!$res["success"])
294   - throw new Exception('Error to load derived parameter file : '.$res["message"]);
295   -
296   - if (isset($res["param"]["info"]["parsedExpression"])) {
297   - //Re use existing parsed expression info
298   - $expressionInfo = $res["param"]["info"]["parsedExpression"];
299   - }
300   - else {
301   - //parse expression
302   - $expressionInfo = $this->parseExpression($res["param"]["expression"], $paramsData->getWorkingPath());
303   -
304   - if (!$expressionInfo['success']) {
305   - throw new Exception($expressionInfo['message']);
306   - }
307   -
308   - $paramsList = array();
309   - foreach ($expressionInfo['params'] as $p) {
310   - $paramsList[] = $p["paramid"];
311   - }
312   - $this->userParameterMgr->saveDerivedParameterParsedExpression($res["param"]["id"], $expressionInfo["expression"], md5($res["param"]["expression"]), $paramsList);
313   - }
314   -
315   - $paramId = $param;
316   -
317   - //create a process param for the derived parameter
318   - $this->addProcessParam($paramId, $expressionInfo["expression"], $res["param"]["expression"],
319   - $expressionInfo['params'], $res["param"]["info"]["sampling_mode"], $res["param"]["info"]["timestep"], $res["param"]["info"]["reference_param"],
320   - 0,$res["param"]["dateModif"],!empty($res["param"]["info"]["units"]) ? $res["param"]["info"]["units"] : "",
321   - !empty($res["param"]["info"]["yTitle"]) ? $res["param"]["info"]["yTitle"] : "", $paramsData);
322   -
323   - return array("id" => $paramId, "indexes" => array(), "calib_infos" => array());
324   - }
325   -
326   - /*
327   - * @brief Add IMPEX parameter : create dynamically xml parameter descriptor in user WS
328   - */
329   - private function addImpexParam($param,$paramsData,$templateArgs = NULL)
330   - {
331   - if (!isset($this->paramImpexMgr))
332   - $this->paramImpexMgr = new ImpexParamManager();
333   -
334   - $parameterID = $this->paramImpexMgr->getImpexFullParamId($param, $templateArgs);
335   -
336   - $requestNodes = $paramsData->getRequestNodes();
337   -
338   - // it is PARAMSGEN
339   - if (!$requestNodes) {
340   - return array("id" => $parameterID);
341   - }
342   -
343   - $timesNode = $requestNodes[0]->getTimesNode();
344   - $intervals = $timesNode->getIntervals();
345   - $originFile = IHMConfigClass::getUserWSPath().$parameterID.".xml";
346   -
347   - if (!file_exists($originFile)) {
348   - // create IMPEX parameter info and data
349   - $res = $this->paramImpexMgr->createImpexParameter($param, $intervals, $templateArgs);
350   -
351   - if (!$res["success"])
352   - throw new Exception('Error to create IMPEX parameter : '.$res["message"]);
353   -
354   - $newParamNode = $paramsData->addLocalParamToCreate($res["param"]["id"],
355   - $res["param"]["info"]["viId"], $res["param"]["info"]["realVar"],
356   - $res["param"]["info"]["minSampling"], $res["param"]["info"]["maxSampling"],
357   - $res["param"]["info"]["type"],$res["param"]["info"]["size"],
358   - NULL,$res["param"]["dateModif"],true);
359   -
360   - $newParamNode->getInfo()->setName($res["param"]["info"]['name']);
361   - $newParamNode->getInfo()->setShortName($res["param"]["info"]['name']);
362   - $newParamNode->getInfo()->setUnits($res["param"]["info"]['units']);
363   -
364   - $tableDef = $res["param"]["info"]["tableDef"];
365   - if (isset($tableDef) && array_key_exists('tableDefType', $tableDef) && ($tableDef['tableDefType'] != 'NONE'))
366   - {
367   - switch ($tableDef['channelsDefType'])
368   - {
369   - case 'BOUND' :
370   - $boundTable = $newParamNode->getInfo()->addTable(InfoParamTableTypeEnum::BOUNDS, $res["param"]["info"]["yTitle"]);
371   - $boundTable->setUnits($res["param"]["info"]["yUnits"]);
372   - switch ($tableDef['tableDefType'])
373   - {
374   - case 'SELECT' :
375   - $boundTable->setBoundsName($tableDef['data']['bound']);
376   - $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['bound']);
377   - break;
378   - default :
379   - throw new Exception("Unknown tableDefType ".$tableDef['tableDefType']);
380   - }
381   - break;
382   - case 'CENTER' :
383   - $centerTable = $newParamNode->getInfo()->addTable(InfoParamTableTypeEnum::CENTER, $res["param"]["info"]["yTitle"]);
384   - $centerTable->setUnits($res["param"]["info"]["yUnits"]);
385   - $centerTable->setSize($tableDef['data']['width']);
386   - switch ($tableDef['tableDefType'])
387   - {
388   - case 'SELECT' :
389   - $centerTable->setCenterName($tableDef['data']['center']);
390   - $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['center']);
391   - break;
392   - default :
393   - throw new Exception("Unknown tableDefType ".$tableDef['tableDefType']);
394   - }
395   - break;
396   - default :
397   - throw new Exception("Unknown tableDefType ".$tableDef['channelsDefType']);
398   - }
399   - }
400   -
401   - return array("id" => $res["param"]["id"], "plotType" => $res["param"]["info"]["plotType"]);
402   - }
403   - else {
404   - // add IMPEX parameter data
405   - $this->paramImpexMgr->addImpexData($param, $intervals, $templateArgs);
406   - $paramsData->addParamToCopy($parameterID, $originFile);
407   -
408   - return array("id" => $parameterID);
409   - }
410   - }
411   -
412   - /*
413   - * @brief Add uploaded parameter
414   - */
415   - private function addUploadedParam($param,$paramsData)
416   - {
417   - if (!isset($this->userParameterMgr))
418   - $this->userParameterMgr = new IHMUserParamManagerClass();
419   -
420   - //get uploaded parameter info
421   - $res = $this->userParameterMgr->getUploadedParameterFromName($param);
422   -
423   - if (!$res["success"])
424   - throw new Exception('Error to load uploaded parameter file : '.$res["message"]);
425   -
426   - $paramId = $param;
427   -
428   - $newParamNode = $paramsData->addLocalParamToCreate($paramId,
429   - $res["param"]["info"]["viId"], $res["param"]["info"]["realVar"],
430   - $res["param"]["info"]["minSampling"], $res["param"]["info"]["maxSampling"],
431   - $res["param"]["info"]["type"],$res["param"]["info"]["size"],
432   - $res["param"]["info"]["fillValue"],$res["param"]["dateModif"]);
433   -
434   - if (!empty($res["param"]["info"]["yTitle"])) {
435   - $newParamNode->getInfo()->setName($res["param"]["info"]['yTitle']);
436   - $newParamNode->getInfo()->setShortName($res["param"]["info"]['yTitle']);
437   - }
438   - if (!empty($res["param"]["info"]['units'])) {
439   - $newParamNode->getInfo()->setUnits($res["param"]["info"]['units']);
440   - }
441   -
442   -
443   - $tableDef = $res["param"]["info"]["tableDef"];
444   - if (isset($tableDef) && array_key_exists('tableDefType', $tableDef) && ($tableDef['tableDefType'] != 'NONE'))
445   - {
446   - $tableName = empty($tableDef['tableName']) ? 'Table' : $tableDef['tableName'];
447   - $tableUnits = empty($tableDef['tableUnits']) ? '' : $tableDef['tableUnits'];
448   - switch ($tableDef['channelsDefType'])
449   - {
450   - case 'MINMAX' :
451   - $minMaxTable = $newParamNode->getInfo()->addTable(InfoParamTableTypeEnum::MINMAX, $tableName);
452   - $minMaxTable->setUnits($tableUnits);
453   - switch ($tableDef['tableDefType'])
454   - {
455   - case 'SELECT' :
456   - $minMaxTable->setMinName($tableDef['data']['min']);
457   - $minMaxTable->setMaxName($tableDef['data']['max']);
458   - $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['min']);
459   - $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['max']);
460   - break;
461   - case 'MANUAL' :
462   - $minMaxTable->setMinName('min');
463   - $minMaxTable->setMaxName('max');
464   - $clbMinNode = $newParamNode->addClbManual('min');
465   - $clbMinValues = explode(',', $tableDef['data']['min']);
466   - foreach ($clbMinValues as $value)
467   - $clbMinNode->addClbValue($value);
468   - $clbMaxNode = $newParamNode->addClbManual('max');
469   - $clbMaxValues = explode(',', $tableDef['data']['max']);
470   - foreach ($clbMaxValues as $value)
471   - $clbMaxNode->addClbValue($value);
472   - break;
473   - }
474   - break;
475   - case 'BOUND' :
476   - $boundTable = $newParamNode->getInfo()->addTable(InfoParamTableTypeEnum::BOUNDS, $tableName);
477   - $boundTable->setUnits($tableUnits);
478   - switch ($tableDef['tableDefType'])
479   - {
480   - case 'SELECT' :
481   - $boundTable->setBoundsName($tableDef['data']['bound']);
482   - $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['bound']);
483   - break;
484   - case 'MANUAL' :
485   - $boundTable->setBoundsName('bound');
486   - $clbBoundNode = $newParamNode->addClbManual('bound');
487   - $clbBoundValues = explode(',', $tableDef['data']['bound']);
488   - foreach ($clbBoundValues as $value)
489   - $clbBoundNode->addClbValue($value);
490   - break;
491   - }
492   - break;
493   - case 'CENTER' :
494   - $centerTable = $newParamNode->getInfo()->addTable(InfoParamTableTypeEnum::CENTER, $tableName);
495   - $centerTable->setUnits($tableUnits);
496   - $centerTable->setSize($tableDef['data']['width']);
497   - switch ($tableDef['tableDefType'])
498   - {
499   - case 'SELECT' :
500   - $centerTable->setCenterName($tableDef['data']['center']);
501   - $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['center']);
502   - break;
503   - case 'MANUAL' :
504   - $centerTable->setCenterName('center');
505   - $clbCenterNode = $newParamNode->addClbManual('center');
506   - $clbCenterValues = explode(',', $tableDef['data']['center']);
507   - foreach ($clbCenterValues as $value)
508   - $clbCenterNode->addClbValue($value);
509   - break;
510   - }
511   - break;
512   - case 'CENTERWIDTH' :
513   - $centerWidthTable = $newParamNode->getInfo()->addTable(InfoParamTableTypeEnum::CENTERWIDTH, $tableName);
514   - $centerWidthTable->setUnits($tableUnits);
515   - switch ($tableDef['tableDefType'])
516   - {
517   - case 'SELECT' :
518   - $centerWidthTable->setCenterName($tableDef['data']['center']);
519   - $centerWidthTable->setWidthName($tableDef['data']['width']);
520   - $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['center']);
521   - $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['width']);
522   - break;
523   - case 'MANUAL' :
524   - $centerWidthTable->setCenterName('center');
525   - $centerWidthTable->setWidthName('width');
526   - $clbCenterNode = $newParamNode->addClbManual('center');
527   - $clbWidthNode = $newParamNode->addClbManual('width');
528   - $clbCenterValues = explode(',', $tableDef['data']['center']);
529   - foreach ($clbCenterValues as $value)
530   - $clbCenterNode->addClbValue($value);
531   - $clbWidthValues = explode(',', $tableDef['data']['width']);
532   - foreach ($clbWidthValues as $value)
533   - $clbWidthNode->addClbValue($value);
534   - break;
535   - }
536   - break;
537   - }
538   - }
539   -
540   - return array("id" => $paramId, "plotType" => $res["param"]["info"]["plotType"]);
541   - }
542   -
543   - public function applyFilter($paramsData, $paramData, &$paramInfo) {
544   - $filter = (isset($paramData->{'filter_spikes'}) && ($paramData->{'filter_spikes'}))? true:false;
545   - if(!$filter){
546   - return;
547   - }
548   - $my_type= $paramData->{'type'};
549   -
550   - switch ($paramData->{'type'}) {
551   - case 0:
552   - break;
553   - case 1:
554   - // vector
555   - $dim1_index = ($dim1_is_range || !isset($paramData->{'dim1-index'}) || ($paramData->{'dim1-index'} == '')) ? '*' : $paramData->{'dim1-index'};
556   - $dim2_index = ($dim2_is_range || !isset($paramData->{'dim2-index'}) || ($paramData->{'dim2-index'} == '')) ? '*' : $paramData->{'dim2-index'};
557   - $factor = !empty($paramData->{'filter_spikes_factor'}) ? $paramData->{'filter_spikes_factor'} : 5;
558   - $nPoints = !empty($paramData->{'filter_spikes_nPoints'}) ? $paramData->{'filter_spikes_nPoints'} : 100;
559   - if($dim1_index != '*'){
560   - $template_args = array(
561   - 'paramid' => $paramInfo['id'],
562   - 'factor' => $factor,
563   - 'nPoints' => $nPoints,
564   - 'index' => $dim1_index
565   - );
566   - $paramInfo = $this->addExistingParam('filter_spikes_component', $paramsData, $template_args);
567   - }else{
568   - $template_args = array(
569   - 'paramid' => $paramInfo['id'],
570   - 'factor' => $factor,
571   - 'nPoints' => $nPoints,
572   - );
573   - $paramInfo = $this->addExistingParam('filter_spikes', $paramsData, $template_args);
574   - }
575   - break;
576   - case 2:
577   - return array('success' => FALSE, 'message' => '2D Table filtering not implรฉmented yet');
578   -
579   - }
  8 +class IHMParamManagerClass {
  9 +
  10 + protected $userParameterMgr = null;
  11 + protected $templateParamsManager = null;
  12 + protected $paramImpexMgr = null;
  13 + protected $ttCatMgr = null;
  14 + protected $cacheExpressionParser = null;
  15 +
  16 + /*
  17 + * @brief Constructor
  18 + */
  19 +
  20 + function __construct() {
  21 + $this->templateParamsManager = new IHMParamTemplateClass();
  22 + $this->cacheExpressionParser = array();
  23 + }
  24 +
  25 + public function addGeneratedParam($paramId, $expression, $sampling_mode, $sampling_step, $ref_param, $paramsData) {
  26 + $expressionInfo = $this->parseExpression($expression, $paramsData->getWorkingPath());
  27 + if (!$expressionInfo['success']) {
  28 + throw new Exception($expressionInfo['message']);
  29 + }
  30 +
  31 + //create a process param for the derived parameter
  32 + $this->addProcessParam($paramId, $expressionInfo["expression"], $expression, $expressionInfo['params'], $sampling_mode, $sampling_step, $ref_param, 0, time(), "", "", $paramsData);
  33 + }
  34 +
  35 + /*
  36 + * @brief Add an existing parameter
  37 + */
  38 +
  39 + public function addExistingParam($param, $paramsData, $templateArgs = NULL, $tableLink = NULL) {
  40 + if ($this->isDerivedParam($param))
  41 + return $this->addDerivedParam($param, $paramsData);
  42 + else if ($this->isUploadedParam($param))
  43 + return $this->addUploadedParam($param, $paramsData);
  44 + else if ($this->isImpexParam($param))
  45 + return $this->addImpexParam($param, $paramsData, $templateArgs);
  46 + else
  47 + return $this->addLocalParam($param, $paramsData, $templateArgs, $tableLink);
  48 + return "";
  49 + }
  50 +
  51 + /*
  52 + * @brief Add a process parameter
  53 + */
  54 +
  55 + public function addProcessParam($paramId, $expression, $expression_info, $params, $sampling_mode, $sampling_step, $ref_param, $gap, $dateModif, $units, $ytitle, $paramsData) {
  56 + $paramsData->addProcessParamToCreate($paramId, $expression, $expression_info, $params, $sampling_mode, $sampling_step, $ref_param, $gap, $dateModif, $units, $ytitle);
  57 +
  58 + foreach ($params as $param) {
  59 + $template_args = NULL;
  60 +
  61 + if (array_key_exists("template_args", $param))
  62 + $template_args = $param["template_args"];
  63 +
  64 + $this->addExistingParam($param["paramid"], $paramsData, $template_args);
  65 + }
  66 + if (!empty($ref_param)) {
  67 + $this->addExistingParam($ref_param, $paramsData, $template_args);
  68 + }
  69 +
  70 + return true;
  71 + }
  72 +
  73 + /*
  74 + * @brief Add a TT or catalog parameter
  75 + */
  76 +
  77 + public function addTTCatParam($paramId, $paramsData) {
  78 + if (!isset($this->ttCatMgr)) {
  79 + $this->ttCatMgr = new IHMTTCatLoaderClass();
  80 + }
  81 + $info = $this->ttCatMgr->getTTCatInfoFromId($paramId);
  82 +
  83 + if (!$info["success"]) {
  84 + throw new Exception($info["message"]);
  85 + }
  86 +
  87 + $status = array();
  88 + $units = "";
  89 + $ytitle = "";
  90 + $flag = "";
  91 +
  92 + if ($info["info"]["isCatalog"]) {
  93 + $parameters = $this->ttCatMgr->getCatalogParameters($paramId);
  94 + if (!$parameters["success"] || empty($parameters["parameters"])) {
  95 + throw new Exception("Error to extract first parameter of " . $paramId);
  96 + }
  97 + //For the moment, use the first parameter
  98 + $parameter = $parameters["parameters"][0];
  99 + $units = $parameter["units"];
  100 + $ytitle = !empty($parameter["name"]) ? $parameter["name"] : $parameter["id"];
  101 + $flag = $parameter["id"];
  102 + $description = $parameter["description"];
  103 + $desc_parts = array();
  104 + foreach (explode("-", $description) as $def) {
  105 + $def = trim($def);
  106 + $p = strpos($def, ":");
  107 + if ($p === FALSE) {
  108 + continue;
  109 + }
  110 + $val = substr($def, 0, $p);
  111 + $val = trim($val);
  112 + $name = substr($def, $p + 1);
  113 + $name = trim($name);
  114 + $color = "";
  115 + $p = strpos($name, "[");
  116 + if ($p !== FALSE) {
  117 + $color = substr($name, $p);
  118 + $color = trim($color);
  119 + $name = substr($name, 0, $p);
  120 + $name = trim($name);
  121 + }
  122 + $status[] = array(
  123 + "min" => floatval($val),
  124 + "max" => floatval($val),
  125 + "name" => $name,
  126 + "color" => $color,
  127 + );
  128 + }
  129 + } else {
  130 + $status = array(
  131 + array(
  132 + "min" => 1,
  133 + "max" => 1,
  134 + "name" => "Inside",
  135 + "color" => "[255,0,0]",
  136 + )
  137 + );
  138 + $ytitle = $info["info"]["name"];
  139 + }
  140 +
  141 + $paramsData->addTTCatParamToCreate($paramId, $info["info"]["path"], $info["info"]["isShared"], filemtime($info["info"]["path"]), $units, $ytitle, $status, $flag);
  142 + return array("id" => $paramId, "indexes" => array(), "calib_infos" => array());
  143 + }
  144 +
  145 + /*
  146 + * @brief Detect if it's a derived parameter
  147 + */
  148 +
  149 + private function isDerivedParam($param) {
  150 + return preg_match("#^ws_#", $param);
  151 + }
  152 +
  153 + /*
  154 + * @brief Detect if it's a uploaded parameter
  155 + */
  156 +
  157 + public function isUploadedParam($param) {
  158 + return preg_match("#^wsd_#", $param);
  159 + }
  160 +
  161 + /*
  162 + * @brief Detect if it's IMPEX parameter
  163 + */
  164 +
  165 + private function isImpexParam($param) {
  166 + return preg_match("#^" . IHMImpexParamClass::$paramPrefix . "#", $param);
  167 + }
  168 +
  169 + /*
  170 + * @brief Add a local parameter
  171 + */
  172 +
  173 + private function addLocalParam($param, $paramsData, $templateArgs, $tableLink) {
  174 + //local parameter
  175 + $indexes = array();
  176 + $calib_infos = array();
  177 + //check for components
  178 + $pattern = "/(?P<param>.*)\((?P<components>.*)\)/";
  179 + preg_match_all($pattern, $param, $matches);
  180 + if ((count($matches["param"]) > 0) && (count($matches["components"]) > 0)) {
  181 + $paramId = $matches["param"][0];
  182 + $indexes = explode(",", $matches["components"][0]);
  183 + } else
  184 + $paramId = $param;
  185 +
  186 + //check templated parameter
  187 + $real_param_id = $paramId;
  188 + $paramPath = "";
  189 + if ($this->templateParamsManager->isTemplatedParam($paramId)) {
  190 + $paramPath = $this->templateParamsManager->generateTemplatedParamFile($paramId, $templateArgs, $tableLink);
  191 + $real_param_id = $this->templateParamsManager->getTemplatedParamId($paramId, $templateArgs);
  192 + if (empty($paramPath) || !file_exists($paramPath))
  193 + throw new Exception('Cannot generate parameter template file ' . $paramId);
  194 + }
  195 + else {
  196 + $paramPath = IHMConfigClass::getLocalParamDBPath() . $paramId . ".xml";
  197 + if (!file_exists($paramPath))
  198 + throw new Exception('Cannot find parameter local file ' . $paramId);
  199 + }
  200 +
  201 + $paramsData->addParamToCopy($real_param_id, $paramPath);
  202 +
  203 + $this->addLinkedLocalParams($paramId, $paramsData, $templateArgs);
  204 +
  205 + return array("id" => $real_param_id, "indexes" => $indexes, "calib_infos" => $calib_infos, "path" => $paramPath);
  206 + }
  207 +
  208 + /*
  209 + * @brief Add linked parameter
  210 + */
  211 +
  212 + private function addLinkedLocalParams($paramId, $paramsData, $templateArgs = NULL) {
  213 + $doc = new DOMDocument("1.0", "UTF-8");
  214 + $doc->preserveWhiteSpace = false;
  215 + $doc->formatOutput = true;
  216 +
  217 + $real_param_id = $paramId;
  218 + if ($this->templateParamsManager->isTemplatedParam($paramId)) {
  219 + $paramPath = $this->templateParamsManager->getTemplatePath($paramId);
  220 + if (empty($paramPath) || !@$doc->load($paramPath))
  221 + throw new Exception('Cannot find parameter template file ' . $paramId);
  222 + }
  223 + else {
  224 + $paramPath = IHMConfigClass::getLocalParamDBPath() . $paramId . ".xml";
  225 + if (empty($paramPath) || !@$doc->load($paramPath))
  226 + throw new Exception('Cannot find parameter local file ' . $paramId);
  227 + }
  228 +
  229 + //<get>
  230 + $getNodes = $doc->getElementsByTagName('get');
  231 +
  232 + if ($getNodes->length <= 0)
  233 + throw new Exception('Parameter local file ' . $paramId . ' dont have a getter node');
  234 +
  235 + $getNode = $getNodes->item(0);
  236 +
  237 + //<amdaParam name="imf"/>
  238 + $amdaParamNodes = $doc->getElementsByTagName('amdaParam');
  239 +
  240 + foreach ($amdaParamNodes as $amdaParamNode) {
  241 + $linkedParamId = $amdaParamNode->getAttribute('name');
  242 + if (empty($linkedParamId))
  243 + continue;
  244 + $template_id = $this->templateParamsManager->getTemplateId($linkedParamId);
  245 + $tempArgs = isset($templateArgs) ? $templateArgs : array();
  246 + if ($template_id !== FALSE) {
  247 + $linkedParamId = $template_id;
  248 + } else {
  249 + $linkedParamId = $this->templateParamsManager->replaceArgs($linkedParamId, $templateArgs);
  250 + $parsedParam = $this->templateParamsManager->parseTemplatedParam($linkedParamId);
  251 + if ($parsedParam !== FALSE) {
  252 + $linkedParamId = $parsedParam['paramid'];
  253 + foreach ($parsedParam['template_args'] as $key => $val) {
  254 + $tempArgs[$key] = $val;
580 255 }
581   -
582   -
583   - public function applyRangesAndIndexes($paramsData, $paramData, $force_total_2d, &$paramInfo) {
584   - $dim1_min = 0;
585   - $dim1_max = 0;
586   - $dim2_min = 0;
587   - $dim2_max = 0;
588   -
589   - $dim1_is_range = (isset($paramData->{'dim1-sum-type'}) && ($paramData->{'dim1-sum-type'} > 0));
590   - $dim1_index = ($dim1_is_range || !isset($paramData->{'dim1-index'}) || ($paramData->{'dim1-index'} == '')) ? '*' : $paramData->{'dim1-index'};
591   - if ($dim1_is_range) {
592   - switch ($paramData->{'dim1-sum-type'}) {
593   - case 1:
594   - //Sum between a range of value
595   - $dim1_min = !empty($paramData->{'dim1-min-value'}) ? $paramData->{'dim1-min-value'} : 0;
596   - $dim1_max = !empty($paramData->{'dim1-max-value'}) ? $paramData->{'dim1-max-value'} : 0;
597   - break;
598   - case 2:
599   - //Sum between indexes
600   - $dim1_min = !empty($paramData->{'dim1-min-index'}) ? $paramData->{'dim1-min-index'} : 0;
601   - $dim1_max = !empty($paramData->{'dim1-max-index'}) ? $paramData->{'dim1-max-index'} : 0;
602   - break;
603   - }
604   - }
605   -
606   - $dim2_is_range = (isset($paramData->{'dim2-sum-type'}) && ($paramData->{'dim2-sum-type'} > 0));
607   - $dim2_index = ($dim2_is_range || !isset($paramData->{'dim2-index'}) || ($paramData->{'dim2-index'} == '')) ? '*' : $paramData->{'dim2-index'};
608   - if ($dim2_is_range) {
609   - switch ($paramData->{'dim2-sum-type'}) {
610   - case 1:
611   - //Sum between a range of value
612   - $dim2_min = !empty($paramData->{'dim2-min-value'}) ? $paramData->{'dim2-min-value'} : 0;
613   - $dim2_max = !empty($paramData->{'dim2-max-value'}) ? $paramData->{'dim2-max-value'} : 0;
614   - break;
615   - case 2:
616   - //Sum between indexes
617   - $dim2_min = !empty($paramData->{'dim2-min-index'}) ? $paramData->{'dim2-min-index'} : 0;
618   - $dim2_max = !empty($paramData->{'dim2-max-index'}) ? $paramData->{'dim2-max-index'} : 0;
619   - break;
620   - }
621   - }
622   -
623   - switch ($paramData->{'type'}) {
624   - case 0:
625   - //scalar - nothing to do
626   - break;
627   - case 1:
628   - //Tab1D
629   - if ($dim1_is_range) {
630   - $template_args = array(
631   - 'paramid' => $paramInfo['id'],
632   - 'min' => $dim1_min,
633   - 'max' => $dim1_max,
634   - 'relateddim' => 0,
635   - );
636   - if ($paramData->{'dim1-sum-type'} == 2)
637   - $paramInfo = $this->addExistingParam('sum_into_table_indexes', $paramsData, $template_args);
638   - else
639   - $paramInfo = $this->addExistingParam('sum_into_table_range', $paramsData, $template_args);
640   - }
641   - else if ($dim2_is_range) {
642   - $template_args = array(
643   - 'paramid' => $paramInfo['id'],
644   - 'min' => $dim2_min,
645   - 'max' => $dim2_max,
646   - 'relateddim' => 1,
647   - );
648   - if ($paramData->{'dim2-sum-type'} == 2)
649   - $paramInfo = $this->addExistingParam('sum_into_table_indexes', $paramsData, $template_args);
650   - else
651   - $paramInfo = $this->addExistingParam('sum_into_table_range', $paramsData, $template_args);
652   - }
653   - else if ($dim1_index != '*') {
654   - $paramInfo['indexes'][] = $dim1_index;
655   - }
656   - else if ($dim2_index != '*') {
657   - $paramInfo['indexes'][] = $dim2_index;
658   - }
659   - break;
660   - case 2:
661   - //Tab2D
662   - if ($dim1_is_range && $dim2_is_range) {
663   - if ($paramData->{'dim1-sum-type'} != $paramData->{'dim2-sum-type'}) {
664   - throw new Exception("Not supported - Dimensions ranges for ".$paramInfo['id']." must have the same type for each dimensions");
665   - }
666   - $template_args = array(
667   - 'paramid' => $paramInfo['id'],
668   - 'min1' => $dim1_min,
669   - 'max1' => $dim1_max,
670   - 'relateddim1' => 0,
671   - 'min2' => $dim2_min,
672   - 'max2' => $dim2_max,
673   - );
674   - if ($paramData->{'dim1-sum-type'} == 2)
675   - $paramInfo = $this->addExistingParam('sum_into_table_indexes_2d', $paramsData, $template_args);
676   - else
677   - $paramInfo = $this->addExistingParam('sum_into_table_range_2d', $paramsData, $template_args);
678   - }
679   - else if ($dim1_is_range) {
680   - $template_args = array(
681   - 'paramid' => $paramInfo['id'],
682   - 'min' => $dim1_min,
683   - 'max' => $dim1_max,
684   - 'relateddim' => 0,
685   - );
686   - $tableLink = array(
687   - 'paramid' => $paramInfo['id'],
688   - 'relateddim' => 1,
689   - );
690   - if ($paramData->{'dim1-sum-type'} == 2)
691   - $paramInfo = $this->addExistingParam('sum_into_table_indexes', $paramsData, $template_args, $tableLink);
692   - else
693   - $paramInfo = $this->addExistingParam('sum_into_table_range', $paramsData, $template_args, $tableLink);
694   - if ($dim2_index != '*') {
695   - $paramInfo['indexes'][] = $dim2_index;
696   - }
697   - }
698   - else if ($dim2_is_range) {
699   - $template_args = array(
700   - 'paramid' => $paramInfo['id'],
701   - 'min' => $dim2_min,
702   - 'max' => $dim2_max,
703   - 'relateddim' => 1,
704   - );
705   - $tableLink = array(
706   - 'paramid' => $paramInfo['id'],
707   - 'relateddim' => 0,
708   - );
709   - if ($paramData->{'dim2-sum-type'} == 2)
710   - $paramInfo = $this->addExistingParam('sum_into_table_indexes', $paramsData, $template_args, $tableLink);
711   - else
712   - $paramInfo = $this->addExistingParam('sum_into_table_range', $paramsData, $template_args, $tableLink);
713   - if ($dim1_index != '*') {
714   - $paramInfo['indexes'][] = $dim1_index;
715   - }
716   - }
717   - else if (($dim1_index != '*') && ($dim2_index != '*')) {
718   - $paramInfo['indexes'][] = "[".$dim1_index.",".$dim2_index."]";
719   - }
720   - else if ($dim1_index != '*') {
721   - $paramInfo['indexes'][] = "[".$dim1_index.",*]";
722   - }
723   - else if ($dim2_index != '*') {
724   - $paramInfo['indexes'][] = "[*,".$dim2_index."]";
725   - }
726   - else if ($force_total_2d) {
727   - //total over 2 dims
728   - $template_args = array(
729   - 'paramid' => $paramInfo['id'],
730   - );
731   - $paramInfo = $this->addExistingParam('total_2D', $paramsData, $template_args);
732   - }
733   - break;
734   - }
735   - }
736   -
737   - public function parseExpression($expression, $workingDir) {
738   - $outputFileName = "parser_".md5($expression).".xml";
739   - if (array_key_exists($outputFileName, $this->cacheExpressionParser)) {
740   - return $this->cacheExpressionParser[$outputFileName];
741   - }
742   - $parserData = new ParserRequestDataClass();
743   - $parserData->setManagerFilePath(IHMConfigClass::getProcessManagerFilePath());
744   - $parserData->addExpression($expression);
745   - $parserData->setWorkingPath($workingDir);
746   - $parserData->setLocalParamsPath(IHMConfigClass::getLocalParamDBPath());
747   - $parserData->setConstantsFilePath(IHMConfigClass::getConstantsFilePath());
748   - $parserData->setFunctionsFilePath(IHMConfigClass::getFunctionsFilePath());
749   - $parserData->setParamTemplatesFilePath(IHMConfigClass::getParamTemplateListFilePath());
750   - $parserData->setFunctionsArgsListFilePath(IHMConfigClass::getFunctionsArgsListFilePath());
751   - $parserData->setOutputFileName($outputFileName);
752   - $resultFilePath = $workingDir."/".$outputFileName;
753   -
754   - $parserRequest = new ParserRequestClass();
755   - $parserRequest->setData($parserData);
756   -
757   - if (!$parserRequest->init() || !$parserRequest->run()) {
758   - if (file_exists($resultFilePath)) {
759   - unlink($resultFilePath);
760   - }
761   - return array('success' => FALSE, 'message' => 'Error to init or run expression parser');
762   - }
763   -
764   - //Load result file
765   - $doc = new DOMDocument();
766   - $doc->load($resultFilePath);
767   - if (!$doc->load($resultFilePath)) {
768   - if (file_exists($resultFilePath)) {
769   - unlink($resultFilePath);
770   - }
771   - return array('success' => FALSE, 'message' => 'Error to load parser result file');
772   - }
773   -
774   - $expressionNodes = $doc->getElementsByTagName('expression');
775   - if ($expressionNodes->length == 0) {
776   - unlink($resultFilePath);
777   - return array('success' => FALSE, 'message' => 'Cannot get expression nodes in parser result file');
778   - }
779   -
780   - $crtExpressionNode = NULL;
781   - foreach ($expressionNodes as $expressionNode) {
782   - $ihmExpressionNodes = $expressionNode->getElementsByTagName('ihm');
783   - if ($ihmExpressionNodes->length == 0) {
784   - continue;
785   - }
786   - if ($ihmExpressionNodes->item(0)->nodeValue == $expression) {
787   - $crtExpressionNode = $expressionNode;
788   - break;
789   - }
790   - }
791   -
792   - if (!isset($crtExpressionNode)) {
793   - unlink($resultFilePath);
794   - return array('success' => FALSE, 'message' => 'Cannot retrieve expression in parser result file');
795   - }
796   -
797   - if ($crtExpressionNode->getAttribute('success') != "true") {
798   - unlink($resultFilePath);
799   - return array('success' => FALSE, 'message' => 'Synthax error in expression '.$expression);
800   - }
801   -
802   - $kernelExpressionNodes = $crtExpressionNode->getElementsByTagName('kernel');
803   - if ($kernelExpressionNodes->length == 0) {
804   - unlink($resultFilePath);
805   - return array('success' => FALSE, 'message' => 'Cannot retrieve kernel expression in parser result file');
806   - }
807   -
808   - $kernelExpression = $kernelExpressionNodes->item(0)->nodeValue;
809   -
810   - if (empty($kernelExpression)) {
811   - unlink($resultFilePath);
812   - return array('success' => FALSE, 'message' => 'Parser return an empty expression');
813   - }
814   -
815   - $params = array();
816   - $paramsNodes = $crtExpressionNode->getElementsByTagName('params');
817   - if ($paramsNodes->length != 0) {
818   - $paramNodes = $paramsNodes->item(0)->getElementsByTagName('param');
819   - if ($paramNodes->length != 0) {
820   - foreach ($paramNodes as $paramNode) {
821   - if (!empty($paramNode->nodeValue)) {
822   - $params[] = array(
823   - 'paramid' => $paramNode->nodeValue
824   - );
825   - }
826   - }
827   - }
828   - }
829   -
830   - unlink($resultFilePath);
831   -
832   - if (empty($params)) {
833   - return array('success' => FALSE, 'message' => 'Expression should contain at least one parameter');
834   - }
835   -
836   - foreach ($params as &$param) {
837   - $templated_param = $this->templateParamsManager->parseTemplatedParam($param['paramid']);
838   - if ($templated_param !== FALSE) {
839   - $param = $templated_param;
840   - }
841   - }
842   -
843   - $this->cacheExpressionParser[$outputFileName] = array('success' => TRUE, 'expression' => $kernelExpression, 'params' => $params);
844   - return $this->cacheExpressionParser[$outputFileName];
845   - }
846   -
847   - public function getTemplateParamsManager() {
848   - return $this->templateParamsManager;
849   - }
  256 + }
  257 + }
  258 +
  259 + if ($this->templateParamsManager->isTemplatedParam($linkedParamId)) {
  260 + $linkedParamPath = $this->templateParamsManager->generateTemplatedParamFile($linkedParamId, $tempArgs);
  261 + $real_linked_param_id = $this->templateParamsManager->getTemplatedParamId($linkedParamId, $tempArgs);
  262 + } else {
  263 + $real_linked_param_id = $linkedParamId;
  264 + $linkedParamPath = IHMConfigClass::getLocalParamDBPath() . $real_linked_param_id . ".xml";
  265 + }
  266 + $paramsData->addParamToCopy($real_linked_param_id, $linkedParamPath);
  267 + $this->addLinkedLocalParams($linkedParamId, $paramsData);
  268 + }
  269 + }
  270 +
  271 + /*
  272 + * @brief Add derived parameter
  273 + */
  274 +
  275 + private function addDerivedParam($param, $paramsData) {
  276 + $time = time();
  277 + if (!isset($this->userParameterMgr))
  278 + $this->userParameterMgr = new IHMUserParamManagerClass();
  279 +
  280 + //get derived parameter info
  281 + $res = $this->userParameterMgr->getDerivedParameterFromName($param);
  282 +
  283 + if (!$res["success"])
  284 + throw new Exception('Error to load derived parameter file : ' . $res["message"]);
  285 +
  286 + if (isset($res["param"]["info"]["parsedExpression"])) {
  287 + //Re use existing parsed expression info
  288 + $expressionInfo = $res["param"]["info"]["parsedExpression"];
  289 + } else {
  290 + //parse expression
  291 + $expressionInfo = $this->parseExpression($res["param"]["expression"], $paramsData->getWorkingPath());
  292 +
  293 + if (!$expressionInfo['success']) {
  294 + throw new Exception($expressionInfo['message']);
  295 + }
  296 +
  297 + $paramsList = array();
  298 + foreach ($expressionInfo['params'] as $p) {
  299 + $paramsList[] = $p["paramid"];
  300 + }
  301 + $this->userParameterMgr->saveDerivedParameterParsedExpression($res["param"]["id"], $expressionInfo["expression"], md5($res["param"]["expression"]), $paramsList);
  302 + }
  303 +
  304 + $paramId = $param;
  305 +
  306 + //create a process param for the derived parameter
  307 + $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);
  308 +
  309 + return array("id" => $paramId, "indexes" => array(), "calib_infos" => array());
  310 + }
  311 +
  312 + /*
  313 + * @brief Add IMPEX parameter : create dynamically xml parameter descriptor in user WS
  314 + */
  315 +
  316 + private function addImpexParam($param, $paramsData, $templateArgs = NULL) {
  317 + if (!isset($this->paramImpexMgr))
  318 + $this->paramImpexMgr = new ImpexParamManager();
  319 +
  320 + $parameterID = $this->paramImpexMgr->getImpexFullParamId($param, $templateArgs);
  321 +
  322 + $requestNodes = $paramsData->getRequestNodes();
  323 +
  324 + // it is PARAMSGEN
  325 + if (!$requestNodes) {
  326 + return array("id" => $parameterID);
  327 + }
  328 +
  329 + $timesNode = $requestNodes[0]->getTimesNode();
  330 + $intervals = $timesNode->getIntervals();
  331 + $originFile = IHMConfigClass::getUserWSPath() . $parameterID . ".xml";
  332 +
  333 + if (!file_exists($originFile)) {
  334 + // create IMPEX parameter info and data
  335 + $res = $this->paramImpexMgr->createImpexParameter($param, $intervals, $templateArgs);
  336 +
  337 + if (!$res["success"])
  338 + throw new Exception('Error to create IMPEX parameter : ' . $res["message"]);
  339 +
  340 + $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);
  341 +
  342 + $newParamNode->getInfo()->setName($res["param"]["info"]['name']);
  343 + $newParamNode->getInfo()->setShortName($res["param"]["info"]['name']);
  344 + $newParamNode->getInfo()->setUnits($res["param"]["info"]['units']);
  345 +
  346 + $tableDef = $res["param"]["info"]["tableDef"];
  347 + if (isset($tableDef) && array_key_exists('tableDefType', $tableDef) && ($tableDef['tableDefType'] != 'NONE')) {
  348 + switch ($tableDef['channelsDefType']) {
  349 + case 'BOUND' :
  350 + $boundTable = $newParamNode->getInfo()->addTable(InfoParamTableTypeEnum::BOUNDS, $res["param"]["info"]["yTitle"]);
  351 + $boundTable->setUnits($res["param"]["info"]["yUnits"]);
  352 + switch ($tableDef['tableDefType']) {
  353 + case 'SELECT' :
  354 + $boundTable->setBoundsName($tableDef['data']['bound']);
  355 + $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['bound']);
  356 + break;
  357 + default :
  358 + throw new Exception("Unknown tableDefType " . $tableDef['tableDefType']);
  359 + }
  360 + break;
  361 + case 'CENTER' :
  362 + $centerTable = $newParamNode->getInfo()->addTable(InfoParamTableTypeEnum::CENTER, $res["param"]["info"]["yTitle"]);
  363 + $centerTable->setUnits($res["param"]["info"]["yUnits"]);
  364 + $centerTable->setSize($tableDef['data']['width']);
  365 + switch ($tableDef['tableDefType']) {
  366 + case 'SELECT' :
  367 + $centerTable->setCenterName($tableDef['data']['center']);
  368 + $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['center']);
  369 + break;
  370 + default :
  371 + throw new Exception("Unknown tableDefType " . $tableDef['tableDefType']);
  372 + }
  373 + break;
  374 + default :
  375 + throw new Exception("Unknown tableDefType " . $tableDef['channelsDefType']);
  376 + }
  377 + }
  378 +
  379 + return array("id" => $res["param"]["id"], "plotType" => $res["param"]["info"]["plotType"]);
  380 + } else {
  381 + // add IMPEX parameter data
  382 + $this->paramImpexMgr->addImpexData($param, $intervals, $templateArgs);
  383 + $paramsData->addParamToCopy($parameterID, $originFile);
  384 +
  385 + return array("id" => $parameterID);
  386 + }
  387 + }
  388 +
  389 + /*
  390 + * @brief Add uploaded parameter
  391 + */
  392 +
  393 + private function addUploadedParam($param, $paramsData) {
  394 + if (!isset($this->userParameterMgr))
  395 + $this->userParameterMgr = new IHMUserParamManagerClass();
  396 +
  397 + //get uploaded parameter info
  398 + $res = $this->userParameterMgr->getUploadedParameterFromName($param);
  399 +
  400 + if (!$res["success"])
  401 + throw new Exception('Error to load uploaded parameter file : ' . $res["message"]);
  402 +
  403 + $paramId = $param;
  404 +
  405 + $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"]);
  406 +
  407 + if (!empty($res["param"]["info"]["yTitle"])) {
  408 + $newParamNode->getInfo()->setName($res["param"]["info"]['yTitle']);
  409 + $newParamNode->getInfo()->setShortName($res["param"]["info"]['yTitle']);
  410 + }
  411 + if (!empty($res["param"]["info"]['units'])) {
  412 + $newParamNode->getInfo()->setUnits($res["param"]["info"]['units']);
  413 + }
  414 +
  415 +
  416 + $tableDef = $res["param"]["info"]["tableDef"];
  417 + if (isset($tableDef) && array_key_exists('tableDefType', $tableDef) && ($tableDef['tableDefType'] != 'NONE')) {
  418 + $tableName = empty($tableDef['tableName']) ? 'Table' : $tableDef['tableName'];
  419 + $tableUnits = empty($tableDef['tableUnits']) ? '' : $tableDef['tableUnits'];
  420 + switch ($tableDef['channelsDefType']) {
  421 + case 'MINMAX' :
  422 + $minMaxTable = $newParamNode->getInfo()->addTable(InfoParamTableTypeEnum::MINMAX, $tableName);
  423 + $minMaxTable->setUnits($tableUnits);
  424 + switch ($tableDef['tableDefType']) {
  425 + case 'SELECT' :
  426 + $minMaxTable->setMinName($tableDef['data']['min']);
  427 + $minMaxTable->setMaxName($tableDef['data']['max']);
  428 + $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['min']);
  429 + $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['max']);
  430 + break;
  431 + case 'MANUAL' :
  432 + $minMaxTable->setMinName('min');
  433 + $minMaxTable->setMaxName('max');
  434 + $clbMinNode = $newParamNode->addClbManual('min');
  435 + $clbMinValues = explode(',', $tableDef['data']['min']);
  436 + foreach ($clbMinValues as $value)
  437 + $clbMinNode->addClbValue($value);
  438 + $clbMaxNode = $newParamNode->addClbManual('max');
  439 + $clbMaxValues = explode(',', $tableDef['data']['max']);
  440 + foreach ($clbMaxValues as $value)
  441 + $clbMaxNode->addClbValue($value);
  442 + break;
  443 + }
  444 + break;
  445 + case 'BOUND' :
  446 + $boundTable = $newParamNode->getInfo()->addTable(InfoParamTableTypeEnum::BOUNDS, $tableName);
  447 + $boundTable->setUnits($tableUnits);
  448 + switch ($tableDef['tableDefType']) {
  449 + case 'SELECT' :
  450 + $boundTable->setBoundsName($tableDef['data']['bound']);
  451 + $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['bound']);
  452 + break;
  453 + case 'MANUAL' :
  454 + $boundTable->setBoundsName('bound');
  455 + $clbBoundNode = $newParamNode->addClbManual('bound');
  456 + $clbBoundValues = explode(',', $tableDef['data']['bound']);
  457 + foreach ($clbBoundValues as $value)
  458 + $clbBoundNode->addClbValue($value);
  459 + break;
  460 + }
  461 + break;
  462 + case 'CENTER' :
  463 + $centerTable = $newParamNode->getInfo()->addTable(InfoParamTableTypeEnum::CENTER, $tableName);
  464 + $centerTable->setUnits($tableUnits);
  465 + $centerTable->setSize($tableDef['data']['width']);
  466 + switch ($tableDef['tableDefType']) {
  467 + case 'SELECT' :
  468 + $centerTable->setCenterName($tableDef['data']['center']);
  469 + $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['center']);
  470 + break;
  471 + case 'MANUAL' :
  472 + $centerTable->setCenterName('center');
  473 + $clbCenterNode = $newParamNode->addClbManual('center');
  474 + $clbCenterValues = explode(',', $tableDef['data']['center']);
  475 + foreach ($clbCenterValues as $value)
  476 + $clbCenterNode->addClbValue($value);
  477 + break;
  478 + }
  479 + break;
  480 + case 'CENTERWIDTH' :
  481 + $centerWidthTable = $newParamNode->getInfo()->addTable(InfoParamTableTypeEnum::CENTERWIDTH, $tableName);
  482 + $centerWidthTable->setUnits($tableUnits);
  483 + switch ($tableDef['tableDefType']) {
  484 + case 'SELECT' :
  485 + $centerWidthTable->setCenterName($tableDef['data']['center']);
  486 + $centerWidthTable->setWidthName($tableDef['data']['width']);
  487 + $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['center']);
  488 + $newParamNode->getParamGet()->getLocalParam($res["param"]["info"]["realVar"])->addCalibInfo($tableDef['data']['width']);
  489 + break;
  490 + case 'MANUAL' :
  491 + $centerWidthTable->setCenterName('center');
  492 + $centerWidthTable->setWidthName('width');
  493 + $clbCenterNode = $newParamNode->addClbManual('center');
  494 + $clbWidthNode = $newParamNode->addClbManual('width');
  495 + $clbCenterValues = explode(',', $tableDef['data']['center']);
  496 + foreach ($clbCenterValues as $value)
  497 + $clbCenterNode->addClbValue($value);
  498 + $clbWidthValues = explode(',', $tableDef['data']['width']);
  499 + foreach ($clbWidthValues as $value)
  500 + $clbWidthNode->addClbValue($value);
  501 + break;
  502 + }
  503 + break;
  504 + }
  505 + }
  506 +
  507 + return array("id" => $paramId, "plotType" => $res["param"]["info"]["plotType"]);
  508 + }
  509 +
  510 + public function applyFilter($paramsData, $paramData, &$paramInfo) {
  511 + $filter = (isset($paramData->{'param-drawing-object'}->{'filtering-activated'}) && ($paramData->{'param-drawing-object'}->{'filtering-activated'})) ? true : false;
  512 + if (!$filter) {
  513 + return;
  514 + }
  515 + $my_type = $paramData->{'type'};
  516 +
  517 + switch ($paramData->{'type'}) {
  518 + case 0:
  519 + case 1:
  520 + // vector
  521 + $dim1_index = ($dim1_is_range || !isset($paramData->{'dim1-index'}) || ($paramData->{'dim1-index'} == '')) ? '*' : $paramData->{'dim1-index'};
  522 + $dim2_index = ($dim2_is_range || !isset($paramData->{'dim2-index'}) || ($paramData->{'dim2-index'} == '')) ? '*' : $paramData->{'dim2-index'};
  523 + if (isset($paramData->{'param-drawing-object'}->{'filtering-level'})) {
  524 + switch ($paramData->{'param-drawing-object'}->{'filtering-level'}) {
  525 + case 1:
  526 + $factor = 6;
  527 + $nPoints = 100;
  528 + $level="low";
  529 + break;
  530 + case 2:
  531 + $factor = 5;
  532 + $nPoints = 100;
  533 + $level="medium";
  534 + break;
  535 + case 3:
  536 + $factor = 4;
  537 + $nPoints = 100;
  538 + $level="strong";
  539 + break;
  540 + default:
  541 + $factor = 6;
  542 + $nPoints = 100;
  543 + $level="low";
  544 + }
  545 + } else {
  546 + $factor = 5;
  547 + $nPoints = 100;
  548 + }
  549 +
  550 + if ($dim1_index != '*') {
  551 + $template_args = array(
  552 + 'paramid' => $paramInfo['id'],
  553 + 'factor' => $factor,
  554 + 'nPoints' => $nPoints,
  555 + 'index' => $dim1_index,
  556 + 'level' => $level
  557 + );
  558 + $paramInfo = $this->addExistingParam('filter_spikes_component', $paramsData, $template_args);
  559 + } else {
  560 + $template_args = array(
  561 + 'paramid' => $paramInfo['id'],
  562 + 'factor' => $factor,
  563 + 'nPoints' => $nPoints,
  564 + 'level' => $level
  565 + );
  566 + $paramInfo = $this->addExistingParam('filter_spikes', $paramsData, $template_args);
  567 + }
  568 + break;
  569 + case 2:
  570 + return array('success' => FALSE, 'message' => '2D Table filtering not implรฉmented yet');
  571 + }
  572 + }
  573 +
  574 + public function applyRangesAndIndexes($paramsData, $paramData, $force_total_2d, &$paramInfo) {
  575 + $dim1_min = 0;
  576 + $dim1_max = 0;
  577 + $dim2_min = 0;
  578 + $dim2_max = 0;
  579 +
  580 + $dim1_is_range = (isset($paramData->{'dim1-sum-type'}) && ($paramData->{'dim1-sum-type'} > 0));
  581 + $dim1_index = ($dim1_is_range || !isset($paramData->{'dim1-index'}) || ($paramData->{'dim1-index'} == '')) ? '*' : $paramData->{'dim1-index'};
  582 + if ($dim1_is_range) {
  583 + switch ($paramData->{'dim1-sum-type'}) {
  584 + case 1:
  585 + //Sum between a range of value
  586 + $dim1_min = !empty($paramData->{'dim1-min-value'}) ? $paramData->{'dim1-min-value'} : 0;
  587 + $dim1_max = !empty($paramData->{'dim1-max-value'}) ? $paramData->{'dim1-max-value'} : 0;
  588 + break;
  589 + case 2:
  590 + //Sum between indexes
  591 + $dim1_min = !empty($paramData->{'dim1-min-index'}) ? $paramData->{'dim1-min-index'} : 0;
  592 + $dim1_max = !empty($paramData->{'dim1-max-index'}) ? $paramData->{'dim1-max-index'} : 0;
  593 + break;
  594 + }
  595 + }
  596 +
  597 + $dim2_is_range = (isset($paramData->{'dim2-sum-type'}) && ($paramData->{'dim2-sum-type'} > 0));
  598 + $dim2_index = ($dim2_is_range || !isset($paramData->{'dim2-index'}) || ($paramData->{'dim2-index'} == '')) ? '*' : $paramData->{'dim2-index'};
  599 + if ($dim2_is_range) {
  600 + switch ($paramData->{'dim2-sum-type'}) {
  601 + case 1:
  602 + //Sum between a range of value
  603 + $dim2_min = !empty($paramData->{'dim2-min-value'}) ? $paramData->{'dim2-min-value'} : 0;
  604 + $dim2_max = !empty($paramData->{'dim2-max-value'}) ? $paramData->{'dim2-max-value'} : 0;
  605 + break;
  606 + case 2:
  607 + //Sum between indexes
  608 + $dim2_min = !empty($paramData->{'dim2-min-index'}) ? $paramData->{'dim2-min-index'} : 0;
  609 + $dim2_max = !empty($paramData->{'dim2-max-index'}) ? $paramData->{'dim2-max-index'} : 0;
  610 + break;
  611 + }
  612 + }
  613 +
  614 + switch ($paramData->{'type'}) {
  615 + case 0:
  616 + //scalar - nothing to do
  617 + break;
  618 + case 1:
  619 + //Tab1D
  620 + if ($dim1_is_range) {
  621 + $template_args = array(
  622 + 'paramid' => $paramInfo['id'],
  623 + 'min' => $dim1_min,
  624 + 'max' => $dim1_max,
  625 + 'relateddim' => 0,
  626 + );
  627 + if ($paramData->{'dim1-sum-type'} == 2)
  628 + $paramInfo = $this->addExistingParam('sum_into_table_indexes', $paramsData, $template_args);
  629 + else
  630 + $paramInfo = $this->addExistingParam('sum_into_table_range', $paramsData, $template_args);
  631 + }
  632 + else if ($dim2_is_range) {
  633 + $template_args = array(
  634 + 'paramid' => $paramInfo['id'],
  635 + 'min' => $dim2_min,
  636 + 'max' => $dim2_max,
  637 + 'relateddim' => 1,
  638 + );
  639 + if ($paramData->{'dim2-sum-type'} == 2)
  640 + $paramInfo = $this->addExistingParam('sum_into_table_indexes', $paramsData, $template_args);
  641 + else
  642 + $paramInfo = $this->addExistingParam('sum_into_table_range', $paramsData, $template_args);
  643 + }
  644 + else if ($dim1_index != '*') {
  645 + $paramInfo['indexes'][] = $dim1_index;
  646 + } else if ($dim2_index != '*') {
  647 + $paramInfo['indexes'][] = $dim2_index;
  648 + }
  649 + break;
  650 + case 2:
  651 + //Tab2D
  652 + if ($dim1_is_range && $dim2_is_range) {
  653 + if ($paramData->{'dim1-sum-type'} != $paramData->{'dim2-sum-type'}) {
  654 + throw new Exception("Not supported - Dimensions ranges for " . $paramInfo['id'] . " must have the same type for each dimensions");
  655 + }
  656 + $template_args = array(
  657 + 'paramid' => $paramInfo['id'],
  658 + 'min1' => $dim1_min,
  659 + 'max1' => $dim1_max,
  660 + 'relateddim1' => 0,
  661 + 'min2' => $dim2_min,
  662 + 'max2' => $dim2_max,
  663 + );
  664 + if ($paramData->{'dim1-sum-type'} == 2)
  665 + $paramInfo = $this->addExistingParam('sum_into_table_indexes_2d', $paramsData, $template_args);
  666 + else
  667 + $paramInfo = $this->addExistingParam('sum_into_table_range_2d', $paramsData, $template_args);
  668 + }
  669 + else if ($dim1_is_range) {
  670 + $template_args = array(
  671 + 'paramid' => $paramInfo['id'],
  672 + 'min' => $dim1_min,
  673 + 'max' => $dim1_max,
  674 + 'relateddim' => 0,
  675 + );
  676 + $tableLink = array(
  677 + 'paramid' => $paramInfo['id'],
  678 + 'relateddim' => 1,
  679 + );
  680 + if ($paramData->{'dim1-sum-type'} == 2)
  681 + $paramInfo = $this->addExistingParam('sum_into_table_indexes', $paramsData, $template_args, $tableLink);
  682 + else
  683 + $paramInfo = $this->addExistingParam('sum_into_table_range', $paramsData, $template_args, $tableLink);
  684 + if ($dim2_index != '*') {
  685 + $paramInfo['indexes'][] = $dim2_index;
  686 + }
  687 + } else if ($dim2_is_range) {
  688 + $template_args = array(
  689 + 'paramid' => $paramInfo['id'],
  690 + 'min' => $dim2_min,
  691 + 'max' => $dim2_max,
  692 + 'relateddim' => 1,
  693 + );
  694 + $tableLink = array(
  695 + 'paramid' => $paramInfo['id'],
  696 + 'relateddim' => 0,
  697 + );
  698 + if ($paramData->{'dim2-sum-type'} == 2)
  699 + $paramInfo = $this->addExistingParam('sum_into_table_indexes', $paramsData, $template_args, $tableLink);
  700 + else
  701 + $paramInfo = $this->addExistingParam('sum_into_table_range', $paramsData, $template_args, $tableLink);
  702 + if ($dim1_index != '*') {
  703 + $paramInfo['indexes'][] = $dim1_index;
  704 + }
  705 + } else if (($dim1_index != '*') && ($dim2_index != '*')) {
  706 + $paramInfo['indexes'][] = "[" . $dim1_index . "," . $dim2_index . "]";
  707 + } else if ($dim1_index != '*') {
  708 + $paramInfo['indexes'][] = "[" . $dim1_index . ",*]";
  709 + } else if ($dim2_index != '*') {
  710 + $paramInfo['indexes'][] = "[*," . $dim2_index . "]";
  711 + } else if ($force_total_2d) {
  712 + //total over 2 dims
  713 + $template_args = array(
  714 + 'paramid' => $paramInfo['id'],
  715 + );
  716 + $paramInfo = $this->addExistingParam('total_2D', $paramsData, $template_args);
  717 + }
  718 + break;
  719 + }
  720 + }
  721 +
  722 + public function parseExpression($expression, $workingDir) {
  723 + $outputFileName = "parser_" . md5($expression) . ".xml";
  724 + if (array_key_exists($outputFileName, $this->cacheExpressionParser)) {
  725 + return $this->cacheExpressionParser[$outputFileName];
  726 + }
  727 + $parserData = new ParserRequestDataClass();
  728 + $parserData->setManagerFilePath(IHMConfigClass::getProcessManagerFilePath());
  729 + $parserData->addExpression($expression);
  730 + $parserData->setWorkingPath($workingDir);
  731 + $parserData->setLocalParamsPath(IHMConfigClass::getLocalParamDBPath());
  732 + $parserData->setConstantsFilePath(IHMConfigClass::getConstantsFilePath());
  733 + $parserData->setFunctionsFilePath(IHMConfigClass::getFunctionsFilePath());
  734 + $parserData->setParamTemplatesFilePath(IHMConfigClass::getParamTemplateListFilePath());
  735 + $parserData->setFunctionsArgsListFilePath(IHMConfigClass::getFunctionsArgsListFilePath());
  736 + $parserData->setOutputFileName($outputFileName);
  737 + $resultFilePath = $workingDir . "/" . $outputFileName;
  738 +
  739 + $parserRequest = new ParserRequestClass();
  740 + $parserRequest->setData($parserData);
  741 +
  742 + if (!$parserRequest->init() || !$parserRequest->run()) {
  743 + if (file_exists($resultFilePath)) {
  744 + unlink($resultFilePath);
  745 + }
  746 + return array('success' => FALSE, 'message' => 'Error to init or run expression parser');
  747 + }
  748 +
  749 + //Load result file
  750 + $doc = new DOMDocument();
  751 + $doc->load($resultFilePath);
  752 + if (!$doc->load($resultFilePath)) {
  753 + if (file_exists($resultFilePath)) {
  754 + unlink($resultFilePath);
  755 + }
  756 + return array('success' => FALSE, 'message' => 'Error to load parser result file');
  757 + }
  758 +
  759 + $expressionNodes = $doc->getElementsByTagName('expression');
  760 + if ($expressionNodes->length == 0) {
  761 + unlink($resultFilePath);
  762 + return array('success' => FALSE, 'message' => 'Cannot get expression nodes in parser result file');
  763 + }
  764 +
  765 + $crtExpressionNode = NULL;
  766 + foreach ($expressionNodes as $expressionNode) {
  767 + $ihmExpressionNodes = $expressionNode->getElementsByTagName('ihm');
  768 + if ($ihmExpressionNodes->length == 0) {
  769 + continue;
  770 + }
  771 + if ($ihmExpressionNodes->item(0)->nodeValue == $expression) {
  772 + $crtExpressionNode = $expressionNode;
  773 + break;
  774 + }
  775 + }
  776 +
  777 + if (!isset($crtExpressionNode)) {
  778 + unlink($resultFilePath);
  779 + return array('success' => FALSE, 'message' => 'Cannot retrieve expression in parser result file');
  780 + }
  781 +
  782 + if ($crtExpressionNode->getAttribute('success') != "true") {
  783 + unlink($resultFilePath);
  784 + return array('success' => FALSE, 'message' => 'Synthax error in expression ' . $expression);
  785 + }
  786 +
  787 + $kernelExpressionNodes = $crtExpressionNode->getElementsByTagName('kernel');
  788 + if ($kernelExpressionNodes->length == 0) {
  789 + unlink($resultFilePath);
  790 + return array('success' => FALSE, 'message' => 'Cannot retrieve kernel expression in parser result file');
  791 + }
  792 +
  793 + $kernelExpression = $kernelExpressionNodes->item(0)->nodeValue;
  794 +
  795 + if (empty($kernelExpression)) {
  796 + unlink($resultFilePath);
  797 + return array('success' => FALSE, 'message' => 'Parser return an empty expression');
  798 + }
  799 +
  800 + $params = array();
  801 + $paramsNodes = $crtExpressionNode->getElementsByTagName('params');
  802 + if ($paramsNodes->length != 0) {
  803 + $paramNodes = $paramsNodes->item(0)->getElementsByTagName('param');
  804 + if ($paramNodes->length != 0) {
  805 + foreach ($paramNodes as $paramNode) {
  806 + if (!empty($paramNode->nodeValue)) {
  807 + $params[] = array(
  808 + 'paramid' => $paramNode->nodeValue
  809 + );
  810 + }
  811 + }
  812 + }
  813 + }
  814 +
  815 + unlink($resultFilePath);
  816 +
  817 + if (empty($params)) {
  818 + return array('success' => FALSE, 'message' => 'Expression should contain at least one parameter');
  819 + }
  820 +
  821 + foreach ($params as &$param) {
  822 + $templated_param = $this->templateParamsManager->parseTemplatedParam($param['paramid']);
  823 + if ($templated_param !== FALSE) {
  824 + $param = $templated_param;
  825 + }
  826 + }
  827 +
  828 + $this->cacheExpressionParser[$outputFileName] = array('success' => TRUE, 'expression' => $kernelExpression, 'params' => $params);
  829 + return $this->cacheExpressionParser[$outputFileName];
  830 + }
  831 +
  832 + public function getTemplateParamsManager() {
  833 + return $this->templateParamsManager;
  834 + }
  835 +
850 836 }
... ...