Blame view

src/InputOutput/IHMImpl/Tools/IHMUserParamManagerClass.php 14.5 KB
22521f1c   Benjamin Renard   First commit
1
2
3
<?php

/**
96c9cffa   Benjamin Renard   Keep expression p...
4
5
 * @class IHMUserParamManagerClass
 * @brief Manager for IHM user parameter properties file
22521f1c   Benjamin Renard   First commit
6
7
 * @details
 */
96c9cffa   Benjamin Renard   Keep expression p...
8
class IHMUserParamManagerClass
22521f1c   Benjamin Renard   First commit
9
10
11
12
13
14
15
16
17
18
19
20
{
	protected $userParamsList = null;
	
	//derived parameter in manager file
	private static $mgrDerivedNode               = 'paramList';
	private static $mgrDerivedParamNode          = 'param';
	private static $mgrDerivedParamIdAtt         = 'xml:id';
	private static $mgrDerivedParamNameAtt       = 'name';
	private static $mgrDerivedParamExpressionAtt = 'buildchain';
	private static $mgrDerivedParamTimeStepAtt   = 'timestep';
	
	//additional info for derived parameter
96c9cffa   Benjamin Renard   Keep expression p...
21
22
23
24
25
26
27
	private static $infoDerivedUnitsNode          = 'units';
	private static $infoDerivedYTitleNode         = 'ytitle';
	private static $infoDerivedDescriptionNode    = 'description';
	private static $infoDerivedParsedExpNode      = 'parsedExp';
	private static $infoDerivedParsedExpValAtt    = 'exp';
	private static $infoDerivedParsedExpHashAtt   = 'hash';
	private static $infoDerivedParsedExpParamsAtt = 'params';
c0535e83   Benjamin Renard   Use units and yTi...
28
29

	private static $infoDerivedUndefined       = 'undefined';
22521f1c   Benjamin Renard   First commit
30
	
944199fe   Benjamin Renard   Use table definit...
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
	//uploaded parameters in manager file
	private static $mgrUploadedNode           = 'mydataList';
	private static $mgrUploadedParamNode      = 'mydata';
	private static $mgrUploadedParamIdAtt     = 'xml:id';
	private static $mgrUploadedParamNameAtt   = 'name';
	
	//additional info for uploaded parameter
	private static $infoUploadedMinSamplingNode = 'minsampling';
	private static $infoUploadedMaxSamplingNode = 'maxsampling';
	private static $infoUploadedRealVarNode     = 'realvar';
	private static $infoUploadedTypeNode        = 'type';
	private static $infoUploadedSizeNode        = 'size';
	private static $infoUploadedVIIdNode        = 'vi';
	private static $infoUploadedPlotTypeNode    = 'plottype';
	private static $infoUploadedTableDefNode    = 'tableDef';
	private static $infoUploadedUnitsNode       = 'units';
	private static $infoUploadedYTitleNode      = 'ytitle';
	
22521f1c   Benjamin Renard   First commit
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
	/*
	 * @brief Constructor
	*/
	function __construct()
	{
	}
	
	/*
	 * @brief Get derived parameter info from name ("ws_***")
	 */
	public function getDerivedParameterFromName($paramName)
	{
		if (!preg_match("#^ws_#",$paramName))
			return array("success" => false, "message" => "Bad derived parameter name");
		
		//extract real parameter name
		$realName = substr($paramName , 3);
		
		//try to load user parameters definition if not already done
		if (!isset($this->userParamsList))
			$this->userParamsList = $this->loadUserParamManagerFile();
		
		if (!$this->userParamsList["success"])
			return $this->userParamsList["success"];
		
		if (isset($this->userParamsList["params"]) && isset($this->userParamsList["params"]["derived"]))
		{
			//find the parameter info
			foreach($this->userParamsList["params"]["derived"] as $paramInfo)
			{
				if ($paramInfo["name"] == $realName)
					return array("success" => true, "param" => $paramInfo);
			}
		}
		
		return array("success" => false, "message" => "Cannot find derived parameter");
	}
	
	/*
02abc780   Benjamin Renard   Support request f...
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
	 * @brief Get derived parameter name from id
	*/
	public function getDerivedParameterNameFromId($paramId)
	{
		if (!preg_match("#^ws_#",$paramId))
			return array("success" => false, "message" => "Bad derived parameter id");
		
		//try to load user parameters definition if not already done
		if (!isset($this->userParamsList))
			$this->userParamsList = $this->loadUserParamManagerFile();
		
		if (!$this->userParamsList["success"])
			return $this->userParamsList["success"];
		
		if (isset($this->userParamsList["params"]) && isset($this->userParamsList["params"]["derived"]))
		{
			//find the parameter name
			foreach($this->userParamsList["params"]["derived"] as $paramInfo)
			{
				if ($paramInfo["id"] == $paramId)
					return array("success" => true, "name" => $paramInfo["name"]);
			}
		}

		return array("success" => false, "message" => "Cannot find derived parameter");
	}
	
	/*
944199fe   Benjamin Renard   Use table definit...
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
	 * @brief Get uploaded parameter info from name ("wsd_***")
	*/
	public function getUploadedParameterFromName($paramName)
	{
		if (!preg_match("#^wsd_#",$paramName))
			return array("success" => false, "message" => "Bad uploaded parameter name");
	
		//extract real parameter name
		$realName = substr($paramName , 4);
	
		//try to load user parameters definition if not already done
		if (!isset($this->userParamsList))
			$this->userParamsList = $this->loadUserParamManagerFile();
	
		if (!$this->userParamsList["success"])
			return $this->userParamsList["success"];
	
		if (isset($this->userParamsList["params"]) && isset($this->userParamsList["params"]["uploaded"]))
		{
			//find the parameter info
			foreach($this->userParamsList["params"]["uploaded"] as $paramInfo)
			{
				if ($paramInfo["name"] == $realName)
					return array("success" => true, "param" => $paramInfo);
			}
		}
	
		return array("success" => false, "message" => "Cannot find uploaded parameter");
	}
	
	/*
02abc780   Benjamin Renard   Support request f...
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
	 * @brief Get uploaded parameter name from id
	*/
	public function getUploadedParameterNameFromId($paramId)
	{
		if (!preg_match("#^wsd_#",$paramId))
			return array("success" => false, "message" => "Bad uploaded parameter id");
	
		//try to load user parameters definition if not already done
		if (!isset($this->userParamsList))
			$this->userParamsList = $this->loadUserParamManagerFile();
	
		if (!$this->userParamsList["success"])
			return $this->userParamsList["success"];
	
		if (isset($this->userParamsList["params"]) && isset($this->userParamsList["params"]["uploaded"]))
		{
			//find the parameter info
			foreach($this->userParamsList["params"]["uploaded"] as $paramInfo)
			{
				if ($paramInfo["id"] == $paramId)
					return array("success" => true, "name" => $paramInfo["name"]);
			}
		}
	
		return array("success" => false, "message" => "Cannot find uploaded parameter");
	}
	
	/*
22521f1c   Benjamin Renard   First commit
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
	 * @brief Load derived parameter manager file
	 */
	private function loadUserParamManagerFile()
	{
		//load xml file
		$dom = new DomDocument("1.0");
		if (!$dom->load(IHMConfigClass::getUserParamManagerFilePath()))
			return array("success" => false, "message" => "Cannot load user parameter manager file");
		
		$userParams = array();
		
		//get derived parameter node
		$derivedNodes = $dom->getElementsByTagName(self::$mgrDerivedNode);
				
		$derivedParams = array();
c582ff6c   Benjamin Renard   Fix test used to ...
190
		if ($derivedNodes->length > 0)
22521f1c   Benjamin Renard   First commit
191
192
193
194
195
196
197
		{	
			$derivedParamNodes = $derivedNodes->item(0)->getElementsByTagName(self::$mgrDerivedParamNode);
			foreach ($derivedParamNodes as $derivedParamNode)
			{	
				//id
				$paramId         = $derivedParamNode->getAttribute(self::$mgrDerivedParamIdAtt);
				
286f7924   Benjamin Renard   Derived parameter...
198
199
200
				//modification date
				$dateModif       = filemtime(IHMConfigClass::getUserDerivedParamFilePath($paramId));
				
22521f1c   Benjamin Renard   First commit
201
202
203
204
205
206
207
208
				//name
				$paramName       = $derivedParamNode->getAttribute(self::$mgrDerivedParamNameAtt);
				
				//expression
				$paramExpression = $derivedParamNode->getAttribute(self::$mgrDerivedParamExpressionAtt);
				
				//timestep
				$paramTimeStep   = $derivedParamNode->getAttribute(self::$mgrDerivedParamTimeStepAtt);
96c9cffa   Benjamin Renard   Keep expression p...
209

22521f1c   Benjamin Renard   First commit
210
211
212
213
214
215
				
				array_push($derivedParams,array(
					"id"         => $paramId,
					"name"       => $paramName,
					"expression" => $paramExpression,
					"timestep"   => $paramTimeStep,
96c9cffa   Benjamin Renard   Keep expression p...
216
					"info"       => $this->loadDerivedParameterInfo($paramId, $paramExpression),
286f7924   Benjamin Renard   Derived parameter...
217
					"dateModif"  => $dateModif
22521f1c   Benjamin Renard   First commit
218
219
220
221
222
223
				));
			}
		}
		
		$userParams["derived"] = $derivedParams;
		
944199fe   Benjamin Renard   Use table definit...
224
225
226
227
		//get uploaded parameter node
		$uploadedNodes = $dom->getElementsByTagName(self::$mgrUploadedNode);
		
		$uploadedParams = array();
c582ff6c   Benjamin Renard   Fix test used to ...
228
		if ($uploadedNodes->length > 0)
944199fe   Benjamin Renard   Use table definit...
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
		{
			$uploadedParamNodes = $uploadedNodes->item(0)->getElementsByTagName(self::$mgrUploadedParamNode);
			foreach ($uploadedParamNodes as $uploadedParamNode)
			{
				//id
				$paramId         = $uploadedParamNode->getAttribute(self::$mgrUploadedParamIdAtt);
		
				//modification date
				$dateModif       = filemtime(IHMConfigClass::getUserUploadedParamFilePath($paramId));
				
				//name
				$paramName       = $uploadedParamNode->getAttribute(self::$mgrUploadedParamNameAtt);
		
				array_push($uploadedParams,array(
				"id"         => $paramId,
				"name"       => $paramName,
				"info"       => $this->loadUploadedParameterInfo($paramId),
				"dateModif"  => $dateModif
				));
			}
		}
		
		$userParams["uploaded"] = $uploadedParams;
		
22521f1c   Benjamin Renard   First commit
253
254
255
256
257
258
		return array("success" => true, "params" => $userParams);
	}
	
	/*
	 * @brief Load additionnal derived parameter info from paramId
	*/
96c9cffa   Benjamin Renard   Keep expression p...
259
	private function loadDerivedParameterInfo($paramId, $paramExpression)
22521f1c   Benjamin Renard   First commit
260
261
	{
		//get full path
944199fe   Benjamin Renard   Use table definit...
262
		$path = IHMConfigClass::getUserDerivedParamFilePath($paramId);
22521f1c   Benjamin Renard   First commit
263
264
	
		$result = array(
96c9cffa   Benjamin Renard   Keep expression p...
265
266
267
268
				"units"            => "",
				"yTitle"           => "",
				"description"      => "",
				"parsedExpression" => NULL,
22521f1c   Benjamin Renard   First commit
269
270
271
272
273
274
275
276
277
278
279
280
		);
		
		if (!file_exists($path))
			return $result;
	
		//load xml file
		$dom = new DomDocument("1.0");
		if (!$dom->load($path))
			return $result;
	
		//get parameter units
		$unitsNodes = $dom->getElementsByTagName(self::$infoDerivedUnitsNode);
c582ff6c   Benjamin Renard   Fix test used to ...
281
		if ($unitsNodes->length > 0) {
22521f1c   Benjamin Renard   First commit
282
			$result["units"] = $unitsNodes->item(0)->nodeValue;
c0535e83   Benjamin Renard   Use units and yTi...
283
284
285
286
287
288
289
			if ($result["units"] == self::$infoDerivedUndefined) {
				$result["units"] = "";
			}
		}

		//get parameter y title
		$yTitleNodes = $dom->getElementsByTagName(self::$infoDerivedYTitleNode);
c582ff6c   Benjamin Renard   Fix test used to ...
290
		if ($yTitleNodes->length > 0) {
c0535e83   Benjamin Renard   Use units and yTi...
291
292
293
294
295
			$result["yTitle"] = $yTitleNodes->item(0)->nodeValue;
			if ($result["yTitle"] == self::$infoDerivedUndefined) {
				$result["yTitle"] = "";
			}
		}
22521f1c   Benjamin Renard   First commit
296
297
298
	
		//get parameter description
		$descNodes = $dom->getElementsByTagName(self::$infoDerivedDescriptionNode);
c582ff6c   Benjamin Renard   Fix test used to ...
299
		if ($descNodes->length > 0)
22521f1c   Benjamin Renard   First commit
300
			$result["description"] = $descNodes->item(0)->nodeValue;
96c9cffa   Benjamin Renard   Keep expression p...
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321

		//get parsed expression if exists
		$parsedExpNodes = $dom->getElementsByTagName(self::$infoDerivedParsedExpNode);
		if ($parsedExpNodes->length > 0) {
			$parsedExpNode    = $parsedExpNodes->item(0);
			$parsedExpVal     = $parsedExpNode->getAttribute(self::$infoDerivedParsedExpValAtt);
			$parsedExpHash    = $parsedExpNode->getAttribute(self::$infoDerivedParsedExpHashAtt);
			$parsedExpParams  = $parsedExpNode->getAttribute(self::$infoDerivedParsedExpParamsAtt);
			if (!empty($parsedExpVal) && !empty($parsedExpParams) && (md5($paramExpression) == $parsedExpHash)) {
				$params = array();
				foreach (explode(',',$parsedExpParams) as $param) {
					$params[] = array(
						'paramid' => $param,
					);
				}
				$result['parsedExpression'] = array(
					"expression" => $parsedExpVal,
					"params"     => $params,
				);
			}
		}
22521f1c   Benjamin Renard   First commit
322
323
324
	
		return $result;
	}
944199fe   Benjamin Renard   Use table definit...
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
	
	/*
	 * @brief Load additionnal uploaded parameter info from paramId
	*/
	private function loadUploadedParameterInfo($paramId)
	{
		//get full path
		$path = IHMConfigClass::getUserUploadedParamFilePath($paramId);
	
		$result = array();
		
		if (!file_exists($path))
			return $result;
		
		//load xml file
		$dom = new DomDocument("1.0");
		if (!$dom->load($path))
			return $result;
	
		//get parameter min sampling
		$minSamplingNodes = $dom->getElementsByTagName(self::$infoUploadedMinSamplingNode);
c582ff6c   Benjamin Renard   Fix test used to ...
346
		if ($minSamplingNodes->length > 0)
944199fe   Benjamin Renard   Use table definit...
347
348
349
350
			$result["minSampling"] = $minSamplingNodes->item(0)->nodeValue;
		
		//get parameter max sampling
		$maxSamplingNodes = $dom->getElementsByTagName(self::$infoUploadedMaxSamplingNode);
c582ff6c   Benjamin Renard   Fix test used to ...
351
		if ($maxSamplingNodes->length > 0)
944199fe   Benjamin Renard   Use table definit...
352
			$result["maxSampling"] = $maxSamplingNodes->item(0)->nodeValue;
c582ff6c   Benjamin Renard   Fix test used to ...
353
354
		else
			$result["maxSampling"] = $result["minSampling"];
944199fe   Benjamin Renard   Use table definit...
355
356
357
		
		//get parameter real var
		$realVarNodes = $dom->getElementsByTagName(self::$infoUploadedRealVarNode);
c582ff6c   Benjamin Renard   Fix test used to ...
358
		if ($realVarNodes->length > 0)
944199fe   Benjamin Renard   Use table definit...
359
360
361
362
			$result["realVar"] = $realVarNodes->item(0)->nodeValue;
		
		//get parameter type
		$typeNodes = $dom->getElementsByTagName(self::$infoUploadedTypeNode);
c582ff6c   Benjamin Renard   Fix test used to ...
363
		if ($typeNodes->length > 0)
944199fe   Benjamin Renard   Use table definit...
364
365
366
367
			$result["type"] = $typeNodes->item(0)->nodeValue;
		
		//get parameter size
		$sizeNodes = $dom->getElementsByTagName(self::$infoUploadedSizeNode);
c582ff6c   Benjamin Renard   Fix test used to ...
368
		if ($sizeNodes->length > 0)
944199fe   Benjamin Renard   Use table definit...
369
370
371
372
			$result["size"] = $sizeNodes->item(0)->nodeValue;
		
		//get parameter VirtualInstrument ID
		$viIdNodes = $dom->getElementsByTagName(self::$infoUploadedVIIdNode);
c582ff6c   Benjamin Renard   Fix test used to ...
373
		if ($viIdNodes->length > 0)
944199fe   Benjamin Renard   Use table definit...
374
375
376
377
			$result["viId"] = $viIdNodes->item(0)->nodeValue;
		
		//get parameter plot type
		$plotTypeNodes = $dom->getElementsByTagName(self::$infoUploadedPlotTypeNode);
c582ff6c   Benjamin Renard   Fix test used to ...
378
		if ($plotTypeNodes->length > 0)
944199fe   Benjamin Renard   Use table definit...
379
380
381
382
			$result["plotType"] = $plotTypeNodes->item(0)->nodeValue;
		
		//get parameter y units
		$unitsNodes = $dom->getElementsByTagName(self::$infoUploadedUnitsNode);
c582ff6c   Benjamin Renard   Fix test used to ...
383
		if ($unitsNodes->length > 0)
944199fe   Benjamin Renard   Use table definit...
384
385
386
387
			$result["units"] = $unitsNodes->item(0)->nodeValue;
		
		//get parameter y title
		$yTitleNodes = $dom->getElementsByTagName(self::$infoUploadedYTitleNode);
c582ff6c   Benjamin Renard   Fix test used to ...
388
		if ($yTitleNodes->length > 0)
944199fe   Benjamin Renard   Use table definit...
389
390
391
392
			$result["yTitle"] = $yTitleNodes->item(0)->nodeValue;
		
		//get table definition
		$tableDefNodes = $dom->getElementsByTagName(self::$infoUploadedTableDefNode);
c582ff6c   Benjamin Renard   Fix test used to ...
393
		if ($tableDefNodes->length > 0)
944199fe   Benjamin Renard   Use table definit...
394
395
396
397
		{
			$tableDefNode = $tableDefNodes->item(0);
			$tableDefType = $tableDefNode->getAttribute('tableDefType');
			$channelsDefType = $tableDefNode->getAttribute('channelsDefType');
df380a21   Benjamin Renard   Fix table name de...
398
399
			$tableName = $tableDefNode->getAttribute('tableName');
			$tableUnits = $tableDefNode->getAttribute('tableUnits');
944199fe   Benjamin Renard   Use table definit...
400
401
402
403
404
405
406
			$tableData = array();
			foreach ($tableDefNode->childNodes as $tableDataNode)
			{
				if ($tableDataNode->nodeType != XML_ELEMENT_NODE)
					continue;
		    	$tableData[$tableDataNode->tagName] = $tableDataNode->nodeValue;
			}
df380a21   Benjamin Renard   Fix table name de...
407
			$result["tableDef"] = array('tableDefType' => $tableDefType, 'channelsDefType' => $channelsDefType, 'tableName' => $tableName, 'tableUnits' => $tableUnits, 'data' => $tableData);
944199fe   Benjamin Renard   Use table definit...
408
409
410
411
		}
		
		return $result;
	}
96c9cffa   Benjamin Renard   Keep expression p...
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445

	public function saveDerivedParameterParsedExpression($paramId, $expression, $hash, $params) {
		//get full path
		$path = IHMConfigClass::getUserDerivedParamFilePath($paramId);

		if (!file_exists($path))
                        return FALSE;

                //load xml file
                $dom = new DomDocument("1.0");
                if (!$dom->load($path))
                        return FALSE;
		$modifTime = filemtime($path);

		$parsedExpNodes = $dom->getElementsByTagName(self::$infoDerivedParsedExpNode);
                if ($parsedExpNodes->length == 0) {
			//create node
			$parsedExpNode = $dom->createElement(self::$infoDerivedParsedExpNode);
			$dom->documentElement->appendChild($parsedExpNode);
		}
		else {
			$parsedExpNode = $parsedExpNodes->item(0);
		}

		$parsedExpNode->setAttribute(self::$infoDerivedParsedExpValAtt, $expression);
		$parsedExpNode->setAttribute(self::$infoDerivedParsedExpHashAtt, $hash);
		$parsedExpNode->setAttribute(self::$infoDerivedParsedExpParamsAtt, implode(',',$params));

		$dom->save($path);

		//Restore file modification time to prevent librairie re-compilation
		touch($path, $modifTime);
		return TRUE;
	}
c0535e83   Benjamin Renard   Use units and yTi...
446
}