Blame view

php/classes/RequestMgr.php 9.26 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();
		
2048f5bc   Benjamin Renard   Fix save & edit plot
33
		if ($type == 'request' ) 
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
		putenv("USER_DATA_PATH=".USERDATADIR);
		putenv("USER_WS_PATH=".USERWSDIR); 
6acb8d2a   Elena.Budnik   checkRequest in R...
50
	}
16035364   Benjamin Renard   First commit
51

6acb8d2a   Elena.Budnik   checkRequest in R...
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
	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...
72
73
74

	public function validNameObject($p)
	{
0c99c4b7   Benjamin Renard   Implements plot t...
75
76
77
78
79
		return parent::validNameObject($p);
	}

	public function renameObject($p)
        {
0c99c4b7   Benjamin Renard   Implements plot t...
80
81
		return parent::renameObject($p);
	}
6acb8d2a   Elena.Budnik   checkRequest in R...
82
	
6acb8d2a   Elena.Budnik   checkRequest in R...
83
84
85
86
	/* Stop Time from StartTime and Interval*/ 
	public function convertTime($obj)
	{
		$time = strtotime($obj->startDate);
16035364   Benjamin Renard   First commit
87

6acb8d2a   Elena.Budnik   checkRequest in R...
88
89
90
91
92
		$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
93

6acb8d2a   Elena.Budnik   checkRequest in R...
94
95
96
97
98
99
		return $obj;
	} 
	//TODO 
	public function markAsUndefined($paramId)
	{
		$n_requests = 0;
16035364   Benjamin Renard   First commit
100

6acb8d2a   Elena.Budnik   checkRequest in R...
101
102
		return $n_requests;
	}
16035364   Benjamin Renard   First commit
103

6acb8d2a   Elena.Budnik   checkRequest in R...
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
	/*
	*   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...
134
135
136
		if (!$obj->timeTables) $obj =  $this->convertTime($obj);
		if (empty($obj->last_update))
			$obj->last_update = filemtime(USERREQDIR.$id);
6acb8d2a   Elena.Budnik   checkRequest in R...
137
138
139
		
		return  $obj;
	}
16035364   Benjamin Renard   First commit
140

6acb8d2a   Elena.Budnik   checkRequest in R...
141
142
143
144
145
146
147
148
149
150
151
152
	/*
	* 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
153
                
6acb8d2a   Elena.Budnik   checkRequest in R...
154
155
156
157
/*
*    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...
158
	protected function createParameter($p, $folder)
6acb8d2a   Elena.Budnik   checkRequest in R...
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
	{
		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 ...
191
192

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

6acb8d2a   Elena.Budnik   checkRequest in R...
202
203
		$this -> addToContent($p, $folder);
		
69c5bc1e   Benjamin Renard   Add modif. time f...
204
		return array('id' => $this->id, 'info' => $info, 'last_update' => $p->last_update) + $additional;
6acb8d2a   Elena.Budnik   checkRequest in R...
205
206
207
208
	}
	
	public static function checkRequest($obj)
	{		  
3152d6be   Elena.Budnik   message var
209
		if (!file_exists(orbitsAllXml)) return array('success' => false, 'message' => 'no orbits descriotion file');
6acb8d2a   Elena.Budnik   checkRequest in R...
210
211
212
213
214
215

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

6acb8d2a   Elena.Budnik   checkRequest in R...
282
283
284
285
286
287
288
					//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
289
290
				
				if (!empty($params))
6acb8d2a   Elena.Budnik   checkRequest in R...
291
				{
9b69cb35   Nathanael Jourdane   Implement batch m...
292
					// tab is not defined, iterate over $obj->tabs?
6acb8d2a   Elena.Budnik   checkRequest in R...
293
					$argsTab['param'] = array_unique($params);
0342cf46   Benjamin Renard   Fix download of I...
294
295
					$argsTab['startTime'] = $obj->startDate;
					$argsTab['stopTime'] = $obj->stopDate;
6acb8d2a   Elena.Budnik   checkRequest in R...
296
297
				}
				if (count($argsTab) > 0) $args[] = $argsTab;
9b69cb35   Nathanael Jourdane   Implement batch m...
298

6acb8d2a   Elena.Budnik   checkRequest in R...
299
				break;
5f7d3cff   Elena.Budnik   no description fo...
300
301
302
			case 'statistics' :
				return array('success' => true);
				break;
6acb8d2a   Elena.Budnik   checkRequest in R...
303
304
305
			default :
				return array('success' => false, 'message' => "unknown action ".$obj->nodeType);
		}
9b69cb35   Nathanael Jourdane   Implement batch m...
306
307
308

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

6acb8d2a   Elena.Budnik   checkRequest in R...
309
310
311
312
313
		try 
		{
			$client = new SoapClient(DD_WSDL);
		}
		catch  (SoapFault $exception)
9b69cb35   Nathanael Jourdane   Implement batch m...
314
		{
6acb8d2a   Elena.Budnik   checkRequest in R...
315
316
			return array('success' => false, 'message' => $exception->faultstring);
		}
9b69cb35   Nathanael Jourdane   Implement batch m...
317

6acb8d2a   Elena.Budnik   checkRequest in R...
318
319
320
		$orbitsXml = new DomDocument("1.0");
		$orbitsXml->load(orbitsAllXml);
		$tr = array('_' => ':');
9b69cb35   Nathanael Jourdane   Implement batch m...
321
322

        foreach ($args as $tab)
6acb8d2a   Elena.Budnik   checkRequest in R...
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
		{
			$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...
351
352

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