Blame view

php/classes/RequestMgr.php 12.3 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);
f3648bf2   Benjamin Renard   Fix for milliseco...
100
101
102
103
		if (empty($obj->durationMs)) {
			//compatibility mode -> automatically set durationMs if not exists
			$obj->durationMs = "000";
		}
b852834a   Hacene SI HADJ MOHAND   progress
104
		$stopTime = $stopTime.'.'.$obj->durationMs;
6acb8d2a   Elena.Budnik   checkRequest in R...
105
		$obj->stopDate = $stopTime;
16035364   Benjamin Renard   First commit
106

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

6acb8d2a   Elena.Budnik   checkRequest in R...
114
115
		return $n_requests;
	}
16035364   Benjamin Renard   First commit
116

6acb8d2a   Elena.Budnik   checkRequest in R...
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
	/*
	*   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...
147
148
149
		if (!$obj->timeTables) $obj =  $this->convertTime($obj);
		if (empty($obj->last_update))
			$obj->last_update = filemtime(USERREQDIR.$id);
6acb8d2a   Elena.Budnik   checkRequest in R...
150
151
152
		
		return  $obj;
	}
16035364   Benjamin Renard   First commit
153

6acb8d2a   Elena.Budnik   checkRequest in R...
154
155
156
157
158
159
160
161
162
163
164
165
	/*
	* 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
166
                
6acb8d2a   Elena.Budnik   checkRequest in R...
167
168
169
170
/*
*    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...
171
	protected function createParameter($p, $folder)
6acb8d2a   Elena.Budnik   checkRequest in R...
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
	{
		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...
189
190
191
			}
			else if ($this->type == 'request') 
			{
6acb8d2a   Elena.Budnik   checkRequest in R...
192
193
194
195
196
				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...
197
198
199
200
					}
				}
			}
		}
0ead0129   Benjamin Renard   Modify save plot ...
201
202

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

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

		//check for orbit templateArgs
		$args = array();	  	   
		switch ($obj->nodeType) 
		{
			case 'request' :
c9db9962   Benjamin Renard   WIP
226
                                
6acb8d2a   Elena.Budnik   checkRequest in R...
227
					 //TODO check TT as well (first start  and last stop ?)
d15524e1   Benjamin Renard   Fix a warning mes...
228
					if ($obj->timesrc != 'Interval') break;	
6acb8d2a   Elena.Budnik   checkRequest in R...
229
230
					
					$argsTab = array();										
c9db9962   Benjamin Renard   WIP
231
					foreach ($obj->panels as $panel)
6acb8d2a   Elena.Budnik   checkRequest in R...
232
233
234
235
236
237
238
239
240
241
242
243
244
245
					{
						$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
246
							$argsTab['startTime'] = $obj->startDate;
e8c7b544   Elena.Budnik   $$ typo
247
							$argsTab['stopTime'] = $obj->stopDate;
6acb8d2a   Elena.Budnik   checkRequest in R...
248
249
250
						}
					}	
					if (count($argsTab) > 0) $args[] = $argsTab;
6acb8d2a   Elena.Budnik   checkRequest in R...
251
				break;
752ba9ab   Benjamin Renard   Fix nodeType for ...
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
			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...
280
281
282
283
284
285
286
287
288
289
			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...
290
291
				{

6acb8d2a   Elena.Budnik   checkRequest in R...
292
293
294
295
296
297
298
					//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
299
300
				
				if (!empty($params))
6acb8d2a   Elena.Budnik   checkRequest in R...
301
				{
9b69cb35   Nathanael Jourdane   Implement batch m...
302
					// tab is not defined, iterate over $obj->tabs?
6acb8d2a   Elena.Budnik   checkRequest in R...
303
					$argsTab['param'] = array_unique($params);
0342cf46   Benjamin Renard   Fix download of I...
304
305
					$argsTab['startTime'] = $obj->startDate;
					$argsTab['stopTime'] = $obj->stopDate;
6acb8d2a   Elena.Budnik   checkRequest in R...
306
307
				}
				if (count($argsTab) > 0) $args[] = $argsTab;
9b69cb35   Nathanael Jourdane   Implement batch m...
308

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

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

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

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

        foreach ($args as $tab)
6acb8d2a   Elena.Budnik   checkRequest in R...
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
		{
			$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...
361
362

        return array('success' => true);
6acb8d2a   Elena.Budnik   checkRequest in R...
363
	}
33519521   Benjamin Renard   Fix saved request...
364
365

	public function getObjectInfo($id) {
533ea933   Benjamin Renard   Show description ...
366
		$info = "<b>Request ID:</b> ".$id."<br/>";
33519521   Benjamin Renard   Fix saved request...
367
368
369
370
371
372
373
374
375
376
377
378
379
380
		
		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':
533ea933   Benjamin Renard   Show description ...
381
				$info .= "<b>Plot:</b> ";
33519521   Benjamin Renard   Fix saved request...
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
				$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";
				}
33519521   Benjamin Renard   Fix saved request...
413
414
				break;
			case 'condition':
533ea933   Benjamin Renard   Show description ...
415
				$info .= "<b>Data Mining:</b> ".htmlspecialchars($obj->expression);
33519521   Benjamin Renard   Fix saved request...
416
417
				break;
			case 'download':
533ea933   Benjamin Renard   Show description ...
418
				$info .= "<b>Download:</b> ";
33519521   Benjamin Renard   Fix saved request...
419
				$params_list = array();
33519521   Benjamin Renard   Fix saved request...
420
421
422
423
424
425
426
427
428
429
430
431
				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";
				}
33519521   Benjamin Renard   Fix saved request...
432
				break;
2e7079bb   Benjamin Renard   First implementat...
433
			case 'statistic':
533ea933   Benjamin Renard   Show description ...
434
				$info .= "<b>Statistic:</b> ";
698494ac   Benjamin Renard   Add tooltip for s...
435
436
437
438
439
440
441
442
443
444
445
446
447
				$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/>";
533ea933   Benjamin Renard   Show description ...
448
							$info .= "<i>" . $func . ":</i> " . implode(', ', $params);
698494ac   Benjamin Renard   Add tooltip for s...
449
450
451
452
453
454
455
456
457
						}
					}
					else {
						$info .= "Empty";
					}
				}
				else {
					$info .= "Empty";
				}
2e7079bb   Benjamin Renard   First implementat...
458
				break;
33519521   Benjamin Renard   Fix saved request...
459
460
461
462
			default:
				$info .= "<b>ERROR:</b> Unknown request type";
		}

533ea933   Benjamin Renard   Show description ...
463
464
465
466
467
		$description = isset($obj->description) ? $obj->description : '';
		if(!empty($description)){
			$info .= '<br/><b>Description:</b> '.$description;
		}

33519521   Benjamin Renard   Fix saved request...
468
469
470
471
472
473
474
475
476
		return $info;
	}

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