Blame view

php/classes/RequestMgr.php 10 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
12
class RequestMgr extends AmdaObjectMgr 
{
	public $obj;
	protected $type;
	protected $jobXml, $jobXmlName;
	protected $types = array('request', 'condition');	  	
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();
		
0c99c4b7   Benjamin Renard   Implements plot t...
33
		if ($type == 'request' || $type == 'plottab') 
6acb8d2a   Elena.Budnik   checkRequest in R...
34
35
36
37
38
39
40
41
42
43
44
45
46
		{
			$this->id_prefix = 'req_';			
		}
		else 
		{
			$this->id_prefix = 'cond_';			
		}
       
		if (!file_exists($this->xmlName)) 
		{
			$this->createDom();
			$this->xp = new domxpath($this->contentDom); 
		}		
16035364   Benjamin Renard   First commit
47

6acb8d2a   Elena.Budnik   checkRequest in R...
48
49
50
51
		putenv("USER_DATA_PATH=".USERDATADIR);
		putenv("USER_WS_PATH=".USERWSDIR); 
		putenv("PHP_CLASSES_PATH=".CLASSPATH);		
	}
16035364   Benjamin Renard   First commit
52

6acb8d2a   Elena.Budnik   checkRequest in R...
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
	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...
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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
116
117
118

	public function validNameObject($p)
	{
		if ($this->type == 'plottab') {
			if (empty($p->name)) {
				return array('valid' => false, 'error' => 'Name is required');
			}
			return array('valid' => true);
		}
		return parent::validNameObject($p);
	}

	public function renameObject($p)
        {
		if ($this->type == 'plottab') {
			//Rename a plot tab
			if (!isset($p->parent) || empty($p->parent)) {
				return array('error' => 'Missing parent definition');
			}
			$plotObj = $this->getObject($p->parent);
			if (is_array($plotObj) && isset($plotObj['error'])) {
				return array('error' => $plotObj['error']);
			}
			if (!isset($plotObj->tabs)) {
				return array('error' => 'Cannot retrieve tab in plot request');
			}
			$renameOK = FALSE;
			foreach ($plotObj->tabs as &$tab) {
				if ($tab->id == $p->id) {
					$tab->{'tab-name'} = $p->name;
					$renameOK = TRUE;
					break;
				}
			}
			if (!$renameOK) {
				return array('error' => 'Cannot retrieve tab in plot request 2');
			}
			//Save modification
			$file = fopen(USERREQDIR.$p->parent, 'w');
			fwrite($file, json_encode($plotObj));
			fclose($file);
			
			return array('id' => $p->id);
		}
		return parent::renameObject($p);
	}
6acb8d2a   Elena.Budnik   checkRequest in R...
119
	
6acb8d2a   Elena.Budnik   checkRequest in R...
120
121
122
123
	/* Stop Time from StartTime and Interval*/ 
	public function convertTime($obj)
	{
		$time = strtotime($obj->startDate);
16035364   Benjamin Renard   First commit
124

6acb8d2a   Elena.Budnik   checkRequest in R...
125
126
127
128
129
		$interval = $obj->durationDay*86400 +
						$obj->durationHour*3600 +
						$obj->durationMin*60 + $obj->durationSec;
		$stopTime = gmdate("Y-m-d\TH:i:s", $time+$interval);
		$obj->stopDate = $stopTime;
16035364   Benjamin Renard   First commit
130

6acb8d2a   Elena.Budnik   checkRequest in R...
131
132
133
134
135
136
		return $obj;
	} 
	//TODO 
	public function markAsUndefined($paramId)
	{
		$n_requests = 0;
16035364   Benjamin Renard   First commit
137

6acb8d2a   Elena.Budnik   checkRequest in R...
138
139
		return $n_requests;
	}
16035364   Benjamin Renard   First commit
140

6acb8d2a   Elena.Budnik   checkRequest in R...
141
142
143
144
145
146
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
	/*
	*   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
		if (!$obj->timeTables) $obj =  $this->convertTime($obj); 
		
		return  $obj;
	}
16035364   Benjamin Renard   First commit
175

6acb8d2a   Elena.Budnik   checkRequest in R...
176
177
178
179
180
181
182
183
184
185
186
187
	/*
	* 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
188
                
6acb8d2a   Elena.Budnik   checkRequest in R...
189
190
191
192
/*
*    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...
193
	protected function createParameter($p, $folder)
6acb8d2a   Elena.Budnik   checkRequest in R...
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
	{
		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);
				$info = $p->expression;
			}
			else if ($this->type == 'request') 
			{
				$info = '';
				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);
						$info = $info.' '.$p->children[$i]->children[$j]->name;
					}
				}
			}
		}
0ead0129   Benjamin Renard   Modify save plot ...
226
227
228
229
230
231
232

		$additional = array();
		if ($this->type == 'request') {
			$additional['tabs'] = array();
			if (isset($p->tabs)) {
				foreach ($p->tabs as $index => $tab) {
					$additional['tabs'][$index] = array(
7c762483   Benjamin Renard   Fix some bugs rel...
233
						"name" => (!empty($tab->{'tab-name'})) ? $tab->{'tab-name'} : "Plot ".($index+1),
0ead0129   Benjamin Renard   Modify save plot ...
234
235
236
237
238
						"id" => $tab->id,
					);
				}
			}
		}
16035364   Benjamin Renard   First commit
239
        
6acb8d2a   Elena.Budnik   checkRequest in R...
240
241
242
243
244
245
		$this->descFileName = USERREQDIR.$this->id;
		$p->id = $this->id;
		// save request as json
		$file = fopen($this->descFileName, 'w');
		fwrite($file, json_encode($p));
		fclose($file);
7c762483   Benjamin Renard   Fix some bugs rel...
246

6acb8d2a   Elena.Budnik   checkRequest in R...
247
248
		$this -> addToContent($p, $folder);
		
0ead0129   Benjamin Renard   Modify save plot ...
249
		return array('id' => $this->id, 'info' => $info) + $additional;
6acb8d2a   Elena.Budnik   checkRequest in R...
250
251
252
253
	}
	
	public static function checkRequest($obj)
	{		  
3152d6be   Elena.Budnik   message var
254
		if (!file_exists(orbitsAllXml)) return array('success' => false, 'message' => 'no orbits descriotion file');
6acb8d2a   Elena.Budnik   checkRequest in R...
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
280
281
282
283
284
285
286

		//check for orbit templateArgs
		$args = array();	  	   
		switch ($obj->nodeType) 
		{
			case 'request' :
				foreach ($obj->tabs as $tab)
				{
					$timesrc = $tab->{'multi-plot-linked'} ? $obj->timesrc : $tab->timesrc;
					
					 //TODO check TT as well (first start  and last stop ?)
					if ($timesrc != 'Interval') continue;	
					// select active tab
					if (!$tab->{'multi-plot-linked'} && $tab->id != $obj->{'last-plotted-tab'}) continue;
					
					$argsTab = array();										
					foreach ($tab->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'] = $tab->{'multi-plot-linked'} ? $obj->startDate : $tab->startDate;
0342cf46   Benjamin Renard   Fix download of I...
287
							$argsTab['stopTime'] = $tab->{'multi-plot-linked'} ? $obj->stopDate : $tab->stopDate;
6acb8d2a   Elena.Budnik   checkRequest in R...
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
						}
					}	
					if (count($argsTab) > 0) $args[] = $argsTab;
				}
				break;
			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...
303
304
				{

6acb8d2a   Elena.Budnik   checkRequest in R...
305
306
307
308
309
310
311
					//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
312
313
				
				if (!empty($params))
6acb8d2a   Elena.Budnik   checkRequest in R...
314
				{
9b69cb35   Nathanael Jourdane   Implement batch m...
315
					// tab is not defined, iterate over $obj->tabs?
6acb8d2a   Elena.Budnik   checkRequest in R...
316
					$argsTab['param'] = array_unique($params);
0342cf46   Benjamin Renard   Fix download of I...
317
318
					$argsTab['startTime'] = $obj->startDate;
					$argsTab['stopTime'] = $obj->stopDate;
6acb8d2a   Elena.Budnik   checkRequest in R...
319
320
				}
				if (count($argsTab) > 0) $args[] = $argsTab;
9b69cb35   Nathanael Jourdane   Implement batch m...
321

6acb8d2a   Elena.Budnik   checkRequest in R...
322
				break;
5f7d3cff   Elena.Budnik   no description fo...
323
324
325
			case 'statistics' :
				return array('success' => true);
				break;
6acb8d2a   Elena.Budnik   checkRequest in R...
326
327
328
			default :
				return array('success' => false, 'message' => "unknown action ".$obj->nodeType);
		}
9b69cb35   Nathanael Jourdane   Implement batch m...
329
330
331

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

6acb8d2a   Elena.Budnik   checkRequest in R...
332
333
334
335
336
		try 
		{
			$client = new SoapClient(DD_WSDL);
		}
		catch  (SoapFault $exception)
9b69cb35   Nathanael Jourdane   Implement batch m...
337
		{
6acb8d2a   Elena.Budnik   checkRequest in R...
338
339
			return array('success' => false, 'message' => $exception->faultstring);
		}
9b69cb35   Nathanael Jourdane   Implement batch m...
340

6acb8d2a   Elena.Budnik   checkRequest in R...
341
342
343
		$orbitsXml = new DomDocument("1.0");
		$orbitsXml->load(orbitsAllXml);
		$tr = array('_' => ':');
9b69cb35   Nathanael Jourdane   Implement batch m...
344
345

        foreach ($args as $tab)
6acb8d2a   Elena.Budnik   checkRequest in R...
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
		{
			$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...
374
375

        return array('success' => true);
6acb8d2a   Elena.Budnik   checkRequest in R...
376
	}
16035364   Benjamin Renard   First commit
377
378
}
?>