Blame view

php/classes/RequestMgr.php 12 KB
16035364   Benjamin Renard   First commit
1
2
3
4
<?php
/**
 * @class RequestMgr
 * @version $Id: RequestMgr.php 2914 2015-05-19 10:31:38Z elena $
16035364   Benjamin Renard   First commit
5
6
 */

6acb8d2a   Elena.Budnik   checkRequest in R...
7
8
9
10
11
class RequestMgr extends AmdaObjectMgr 
{
	public $obj;
	protected $type;
	protected $jobXml, $jobXmlName;
2e7079bb   Benjamin Renard   First implementat...
12
	protected $types = array('request', 'download', 'condition', 'statistic');	  	
18d4a11e   Benjamin Renard   Save and load plo...
13
   
6acb8d2a   Elena.Budnik   checkRequest in R...
14
15
16
17
	function __construct($type) 
	{
		parent::__construct('Request.xml');
		$this->type = $type;
16035364   Benjamin Renard   First commit
18

6acb8d2a   Elena.Budnik   checkRequest in R...
19
20
21
22
23
24
25
26
27
28
29
30
31
32
		$this->contentRootId = $type.'-treeRootNode';
		$this->contentRootTag = $type.'List';
		$this->objTagName = $type;
		
		$this->jobXmlName = USERDIR.'jobs.xml';
		$this->jobXml = new DomDocument("1.0");
		if (file_exists($this->jobXmlName)) 
		{
			$this->jobXml->load($this->jobXmlName);
		}
		
		$this->attributes = array('name' => '');
		$this->optionalAttributes = array();
		
2048f5bc   Benjamin Renard   Fix save & edit plot
33
		if ($type == 'request' ) 
6acb8d2a   Elena.Budnik   checkRequest in R...
34
35
36
		{
			$this->id_prefix = 'req_';			
		}
f569bae5   Benjamin Renard   Save download
37
38
39
40
		else if ($type == 'download' )
		{
			$this->id_prefix = 'down_';
		}
2e7079bb   Benjamin Renard   First implementat...
41
42
43
44
		else if ($type == 'statistic')
		{
			$this->id_prefix = 'stat_';
		}
6acb8d2a   Elena.Budnik   checkRequest in R...
45
46
47
48
49
50
51
52
53
54
		else 
		{
			$this->id_prefix = 'cond_';			
		}
       
		if (!file_exists($this->xmlName)) 
		{
			$this->createDom();
			$this->xp = new domxpath($this->contentDom); 
		}		
16035364   Benjamin Renard   First commit
55

6acb8d2a   Elena.Budnik   checkRequest in R...
56
57
		putenv("USER_DATA_PATH=".USERDATADIR);
		putenv("USER_WS_PATH=".USERWSDIR); 
6acb8d2a   Elena.Budnik   checkRequest in R...
58
	}
16035364   Benjamin Renard   First commit
59

6acb8d2a   Elena.Budnik   checkRequest in R...
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
	protected function setObject($obj) 
	{
		$this->obj = $obj;
	}
          
	/*
	* Delete request/condition JSON file
	*/
	protected function deleteParameter($id)
	{	
		if (file_exists(USERREQDIR.$id)) unlink(USERREQDIR.$id);
	}
        
/*
* TODO Check file JSON objects differ in names only
*/
	protected function renameOnly($p) 
	{	
		return false;
	}
0c99c4b7   Benjamin Renard   Implements plot t...
80
81
82

	public function validNameObject($p)
	{
0c99c4b7   Benjamin Renard   Implements plot t...
83
84
85
86
87
		return parent::validNameObject($p);
	}

	public function renameObject($p)
        {
0c99c4b7   Benjamin Renard   Implements plot t...
88
89
		return parent::renameObject($p);
	}
6acb8d2a   Elena.Budnik   checkRequest in R...
90
	
6acb8d2a   Elena.Budnik   checkRequest in R...
91
92
93
94
	/* Stop Time from StartTime and Interval*/ 
	public function convertTime($obj)
	{
		$time = strtotime($obj->startDate);
16035364   Benjamin Renard   First commit
95

6acb8d2a   Elena.Budnik   checkRequest in R...
96
		$interval = $obj->durationDay*86400 +
b852834a   Hacene SI HADJ MOHAND   progress
97
98
		$obj->durationHour*3600 +
		$obj->durationMin*60 + $obj->durationSec;
6acb8d2a   Elena.Budnik   checkRequest in R...
99
		$stopTime = gmdate("Y-m-d\TH:i:s", $time+$interval);
b852834a   Hacene SI HADJ MOHAND   progress
100
		$stopTime = $stopTime.'.'.$obj->durationMs;
6acb8d2a   Elena.Budnik   checkRequest in R...
101
		$obj->stopDate = $stopTime;
16035364   Benjamin Renard   First commit
102

6acb8d2a   Elena.Budnik   checkRequest in R...
103
104
105
106
107
108
		return $obj;
	} 
	//TODO 
	public function markAsUndefined($paramId)
	{
		$n_requests = 0;
16035364   Benjamin Renard   First commit
109

6acb8d2a   Elena.Budnik   checkRequest in R...
110
111
		return $n_requests;
	}
16035364   Benjamin Renard   First commit
112

6acb8d2a   Elena.Budnik   checkRequest in R...
113
114
115
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
	/*
	*   Get Object JSON!!! (request or condition) into Edit
	*/ 
	public function getObject($id) 
	{
		if (!file_exists(USERREQDIR.$id)) return array('error' => NO_OBJECT_FILE);
	
		if (!($objToGet = $this->contentDom->getElementById($id))) return array('error' => NO_SUCH_ID);
		
		$obj = json_decode(file_get_contents(USERREQDIR.$id));
		//if alias exists, replace parameter name by alias name        
		if (file_exists(USERWSDIR.'Alias.xml')) 
		{
			if ($this->type == 'condition') 
			{
				$obj->expression =$this->setAlias($obj->expression); 
			}
			else if ($this->type == 'request') 
			{
				for ($i=0; $i < count($obj->children); $i++) {
							for ($j=0; $j < count($obj->children[$i]->children); $j++) {
									$obj->children[$i]->children[$j]->name =  $this->setAlias($obj->children[$i]->children[$j]->name);
							}
				}
				//TODO Ajout des SCATTER
				// if $obj->children[$i]->plotType == "SCATTER" 
				//$obj->children[$i]->scatterParam->data->name pour 1 panel (bug si 2 panels devient $obj->children[$i]->scatterParam->data->data->name)
			}    
		}      
		//if Start Time - Stop Time
69c5bc1e   Benjamin Renard   Add modif. time f...
143
144
145
		if (!$obj->timeTables) $obj =  $this->convertTime($obj);
		if (empty($obj->last_update))
			$obj->last_update = filemtime(USERREQDIR.$id);
6acb8d2a   Elena.Budnik   checkRequest in R...
146
147
148
		
		return  $obj;
	}
16035364   Benjamin Renard   First commit
149

6acb8d2a   Elena.Budnik   checkRequest in R...
150
151
152
153
154
155
156
157
158
159
160
161
	/*
	* Change NAME in JSON resource
	*/
	protected function renameInResource($name, $id) 
	{	
		$obj = json_decode(file_get_contents(USERREQDIR.$id));
		$obj->name = $name;
		
		$file = fopen(USERREQDIR.$id, 'w');
		fwrite($file, json_encode($obj));
		fclose($file);
	}
16035364   Benjamin Renard   First commit
162
                
6acb8d2a   Elena.Budnik   checkRequest in R...
163
164
165
166
/*
*    Make new request/condition resource file (JSON!!) and add it to content file
*    ATTENTION : it is not DD parameter!!!
*/
7c762483   Benjamin Renard   Fix some bugs rel...
167
	protected function createParameter($p, $folder)
6acb8d2a   Elena.Budnik   checkRequest in R...
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
	{
		if ($this -> objectExistsByName($p->name)) 
		{
			$p->id  = $this->getObjectIdByName($p->name);
			$this -> deleteObject($p);
		}
		
		$this->id = $this->setId();
		
		if (!$this->id) return array('error' => ID_CREATION_ERROR);
		
		//if alias exists, replace alias name by parameter name
		if (file_exists(USERWSDIR.'Alias.xml')) 
		{
			if ($this->type == 'condition') 
			{
				$p->expression = $this->resetAlias($p->expression);
6acb8d2a   Elena.Budnik   checkRequest in R...
185
186
187
			}
			else if ($this->type == 'request') 
			{
6acb8d2a   Elena.Budnik   checkRequest in R...
188
189
190
191
192
				for ($i=0; $i < count($p->children); $i++) 
				{
					for ($j=0; $j < count($p->children[$i]->children); $j++) 
					{
						$p->children[$i]->children[$j]->name =  $this->resetAlias($p->children[$i]->children[$j]->name);
6acb8d2a   Elena.Budnik   checkRequest in R...
193
194
195
196
					}
				}
			}
		}
0ead0129   Benjamin Renard   Modify save plot ...
197
198

		$additional = array();
16035364   Benjamin Renard   First commit
199
        
6acb8d2a   Elena.Budnik   checkRequest in R...
200
201
		$this->descFileName = USERREQDIR.$this->id;
		$p->id = $this->id;
69c5bc1e   Benjamin Renard   Add modif. time f...
202
		$p->last_update = time(); 
6acb8d2a   Elena.Budnik   checkRequest in R...
203
204
205
206
		// save request as json
		$file = fopen($this->descFileName, 'w');
		fwrite($file, json_encode($p));
		fclose($file);
7c762483   Benjamin Renard   Fix some bugs rel...
207

6acb8d2a   Elena.Budnik   checkRequest in R...
208
209
		$this -> addToContent($p, $folder);
		
33519521   Benjamin Renard   Fix saved request...
210
		return array('id' => $this->id, 'info' => $this->getObjectInfo($p->id), 'last_update' => $p->last_update) + $additional;
6acb8d2a   Elena.Budnik   checkRequest in R...
211
212
213
214
	}
	
	public static function checkRequest($obj)
	{		  
3152d6be   Elena.Budnik   message var
215
		if (!file_exists(orbitsAllXml)) return array('success' => false, 'message' => 'no orbits descriotion file');
6acb8d2a   Elena.Budnik   checkRequest in R...
216
217
218
219
220
221

		//check for orbit templateArgs
		$args = array();	  	   
		switch ($obj->nodeType) 
		{
			case 'request' :
c9db9962   Benjamin Renard   WIP
222
                                
6acb8d2a   Elena.Budnik   checkRequest in R...
223
					 //TODO check TT as well (first start  and last stop ?)
d15524e1   Benjamin Renard   Fix a warning mes...
224
					if ($obj->timesrc != 'Interval') break;	
6acb8d2a   Elena.Budnik   checkRequest in R...
225
226
					
					$argsTab = array();										
c9db9962   Benjamin Renard   WIP
227
					foreach ($obj->panels as $panel)
6acb8d2a   Elena.Budnik   checkRequest in R...
228
229
230
231
232
233
234
235
236
237
238
239
240
241
					{
						$params = array();
						foreach ($panel->params as $param)
						{							 	 
							//TODO not in code spase___IMPEX_ !!!
							//TODO other models (tsyganenko etc)							
							if (preg_match("#^spase___IMPEX_#", $param->paramid))
							{	
								if ($param->template_args->url_XYZ) $params[] = $param->template_args->url_XYZ;	
							}
						}
						if (count($params) > 0) 
						{
							$argsTab['param'] = array_unique($params);
c9db9962   Benjamin Renard   WIP
242
							$argsTab['startTime'] = $obj->startDate;
e8c7b544   Elena.Budnik   $$ typo
243
							$argsTab['stopTime'] = $obj->stopDate;
6acb8d2a   Elena.Budnik   checkRequest in R...
244
245
246
						}
					}	
					if (count($argsTab) > 0) $args[] = $argsTab;
6acb8d2a   Elena.Budnik   checkRequest in R...
247
				break;
752ba9ab   Benjamin Renard   Fix nodeType for ...
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
			case 'multiplot':
				if ($obj->timesrc != 'Interval') break;

				$argsTab = array();
				foreach ($obj->plots as $plot)
				{
					foreach ($plot->panels as $panel)
					{
						$params = array();
						foreach ($panel->params as $param)
						{
							//TODO not in code spase___IMPEX_ !!!
							//TODO other models (tsyganenko etc)
							if (preg_match("#^spase___IMPEX_#", $param->paramid))
							{
								if ($param->template_args->url_XYZ) $params[] = $param->template_args->url_XYZ;
							}
						}
						if (count($params) > 0)
						{
							$argsTab['param'] = array_unique($params);
							$argsTab['startTime'] = $obj->startDate;
							$argsTab['stopTime'] = $obj->stopDate;
						}
					}
				}
				if (count($argsTab) > 0) $args[] = $argsTab;
				break;
6acb8d2a   Elena.Budnik   checkRequest in R...
276
277
278
279
280
281
282
283
284
285
			case 'condition' :
				//$argsTab = array();
				if ($obj->timesrc != 'Interval') break;
				//TODO check for condition
				break;
			case 'download' :
				$argsTab = array();
				if ($obj->timesrc != 'Interval') break;
				
				foreach ($obj->list as $param)
9b69cb35   Nathanael Jourdane   Implement batch m...
286
287
				{

6acb8d2a   Elena.Budnik   checkRequest in R...
288
289
290
291
292
293
294
					//TODO not in code spase___IMPEX_ !!!
					//TODO other models (tsyganenko etc)							
					if (preg_match("#^spase___IMPEX_#", $param->paramid))
					{	
						if ($param->template_args->url_XYZ) $params[] = $param->template_args->url_XYZ;	
					}
				}
fcdd1349   Elena.Budnik   merge with master
295
296
				
				if (!empty($params))
6acb8d2a   Elena.Budnik   checkRequest in R...
297
				{
9b69cb35   Nathanael Jourdane   Implement batch m...
298
					// tab is not defined, iterate over $obj->tabs?
6acb8d2a   Elena.Budnik   checkRequest in R...
299
					$argsTab['param'] = array_unique($params);
0342cf46   Benjamin Renard   Fix download of I...
300
301
					$argsTab['startTime'] = $obj->startDate;
					$argsTab['stopTime'] = $obj->stopDate;
6acb8d2a   Elena.Budnik   checkRequest in R...
302
303
				}
				if (count($argsTab) > 0) $args[] = $argsTab;
9b69cb35   Nathanael Jourdane   Implement batch m...
304

6acb8d2a   Elena.Budnik   checkRequest in R...
305
				break;
2e7079bb   Benjamin Renard   First implementat...
306
			case 'statistic' :
5f7d3cff   Elena.Budnik   no description fo...
307
308
				return array('success' => true);
				break;
6acb8d2a   Elena.Budnik   checkRequest in R...
309
310
311
			default :
				return array('success' => false, 'message' => "unknown action ".$obj->nodeType);
		}
9b69cb35   Nathanael Jourdane   Implement batch m...
312
313
314

		if (count($args) === 0) return array('success' => true);

6acb8d2a   Elena.Budnik   checkRequest in R...
315
316
317
318
319
		try 
		{
			$client = new SoapClient(DD_WSDL);
		}
		catch  (SoapFault $exception)
9b69cb35   Nathanael Jourdane   Implement batch m...
320
		{
6acb8d2a   Elena.Budnik   checkRequest in R...
321
322
			return array('success' => false, 'message' => $exception->faultstring);
		}
9b69cb35   Nathanael Jourdane   Implement batch m...
323

6acb8d2a   Elena.Budnik   checkRequest in R...
324
325
326
		$orbitsXml = new DomDocument("1.0");
		$orbitsXml->load(orbitsAllXml);
		$tr = array('_' => ':');
9b69cb35   Nathanael Jourdane   Implement batch m...
327
328

        foreach ($args as $tab)
6acb8d2a   Elena.Budnik   checkRequest in R...
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
		{
			$startTime = $tab['startTime'];
			$stopTime = $tab['stopTime'];
			
			foreach ($tab['param'] as $param)
			{
				$orbitNode = $orbitsXml->getElementById($param);
				$dsId = $orbitNode->getAttribute('dataset');
				$mission = $orbitNode->getAttribute('mission');
				$target = $orbitNode->getAttribute('target');
				try {
					$res = $client->getStartStop(strtr($dsId,$tr));
					$Time = explode("-",$res);
					$orbStartTime = CommonClass::DDTimeToIso($Time[0]);
					$orbStopTime = CommonClass::DDTimeToIso($Time[1]);					
				}
				catch  (SoapFault $exception) {
					return array('success' => false, 'message' => $exception->faultstring);                        					 
				}
				
				if (($startTime > $orbStopTime) || ($stopTime < $orbStartTime))
					return array('success' => false, 'message' => "Invalid time settings :
										$mission $target orbiting <br/> $orbStartTime - $orbStopTime");
										
				if ( strtotime($stopTime) - strtotime($startTime) > IMPEX_INTERVAL_LIMIT )
					return array('success' => false, 'message' => "Too big interval for IMPEX request : ".IMPEX_INTERVAL_LIMIT/86400.." day limit!");
			}
		}
9b69cb35   Nathanael Jourdane   Implement batch m...
357
358

        return array('success' => true);
6acb8d2a   Elena.Budnik   checkRequest in R...
359
	}
33519521   Benjamin Renard   Fix saved request...
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428

	public function getObjectInfo($id) {
		$info = "Request ID: ".$id."<br/>";
		
		if (!file_exists(USERREQDIR.$id)) {
			$info .= "<b>ERROR:</b> Cannot retrieve request definition file";
			return $info;
		}

		$obj = json_decode(file_get_contents(USERREQDIR.$id));
		if (empty($obj)) {
			$info .= "<b>ERROR:</b> Cannot load request definition file";
			return $info;
		}

		switch ($this->type) {
			case 'request':
				$info .= "Plot: ";
				$panels_list = array();
				if (!empty($obj->panels)) {
					foreach ($obj->panels as $p) {
						$panel_info = "Panel #".$p->{"panel-index"}.": ";
						if (empty($p->params)) {
							$panel_info .= "Empty";
						}
						else {
							$params_list = array();
							if (!empty($p->params)) {
								foreach ($p->params as $p) {
									if (!in_array($p->paramid, $params_list))
										$params_list[] = $p->paramid;
								}
							}
							if (!empty($params_list)) {
								$panel_info .= implode(', ', $params_list);
							}
							else {
								$panel_info .= "Empty";
							}
						}
						$panels_list[] = $panel_info;
					}
				}
				if (!empty($panels_list)) {
					$info .= '<br/>'.implode('<br/>', $panels_list);
				}
				else {
					$info .= "Empty";
				}
				break;
			case 'condition':
				$info .= "Data Mining: ".htmlspecialchars($obj->expression);
				break;
			case 'download':
				$info .= "Download: ";
				$params_list = array();
				if (!empty($obj->list)) {
					foreach ($obj->list as $p) {
						if (!in_array($p->paramid, $params_list))
							$params_list[] = $p->paramid;
					}
				}
				if (!empty($params_list)) {
					$info .= implode(', ',$params_list);
				}
				else {
					$info .= "Empty";
				}
				break;
2e7079bb   Benjamin Renard   First implementat...
429
			case 'statistic':
698494ac   Benjamin Renard   Add tooltip for s...
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
				$info .= "Statistic: ";
				$functions_list = array();
				if (!empty($obj->parameter)) {
					foreach ($obj->parameter as $param) {
						if (!array_key_exists($param->function, $functions_list)) {
							$functions_list[$param->function] = array();
						}
						if (!in_array($param->paramid, $functions_list[$param->function])) {
							$functions_list[$param->function][] = $param->paramid;
						}
					}
					if (!empty($functions_list)) {
						foreach ($functions_list as $func => $params) {
							$info .= "<br/>";
							$info .= "<b>" . $func . ":</b> " . implode(', ', $params);
						}
					}
					else {
						$info .= "Empty";
					}
				}
				else {
					$info .= "Empty";
				}
2e7079bb   Benjamin Renard   First implementat...
454
				break;
33519521   Benjamin Renard   Fix saved request...
455
456
457
458
459
460
461
462
463
464
465
466
467
			default:
				$info .= "<b>ERROR:</b> Unknown request type";
		}

		return $info;
	}

        function modifyObject($p)
        {
		$result = parent::modifyObject($p);
		$result["info"] = $this->getObjectInfo($p->id);
		return $result;
        }
16035364   Benjamin Renard   First commit
468
469
}
?>