Blame view

php/classes/RequestMgr.php 9.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
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
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

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

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

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

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

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

6acb8d2a   Elena.Budnik   checkRequest in R...
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
134
	/*
	*   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...
135
136
137
		if (!$obj->timeTables) $obj =  $this->convertTime($obj);
		if (empty($obj->last_update))
			$obj->last_update = filemtime(USERREQDIR.$id);
6acb8d2a   Elena.Budnik   checkRequest in R...
138
139
140
		
		return  $obj;
	}
16035364   Benjamin Renard   First commit
141

6acb8d2a   Elena.Budnik   checkRequest in R...
142
143
144
145
146
147
148
149
150
151
152
153
	/*
	* 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
154
                
6acb8d2a   Elena.Budnik   checkRequest in R...
155
156
157
158
/*
*    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...
159
	protected function createParameter($p, $folder)
6acb8d2a   Elena.Budnik   checkRequest in R...
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
191
	{
		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 ...
192
193

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

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

		//check for orbit templateArgs
		$args = array();	  	   
		switch ($obj->nodeType) 
		{
			case 'request' :
c9db9962   Benjamin Renard   WIP
217
                                
6acb8d2a   Elena.Budnik   checkRequest in R...
218
					 //TODO check TT as well (first start  and last stop ?)
d15524e1   Benjamin Renard   Fix a warning mes...
219
					if ($obj->timesrc != 'Interval') break;	
6acb8d2a   Elena.Budnik   checkRequest in R...
220
221
					
					$argsTab = array();										
c9db9962   Benjamin Renard   WIP
222
					foreach ($obj->panels as $panel)
6acb8d2a   Elena.Budnik   checkRequest in R...
223
224
225
226
227
228
229
230
231
232
233
234
235
236
					{
						$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
237
							$argsTab['startTime'] = $obj->startDate;
e8c7b544   Elena.Budnik   $$ typo
238
							$argsTab['stopTime'] = $obj->stopDate;
6acb8d2a   Elena.Budnik   checkRequest in R...
239
240
241
						}
					}	
					if (count($argsTab) > 0) $args[] = $argsTab;
6acb8d2a   Elena.Budnik   checkRequest in R...
242
				break;
752ba9ab   Benjamin Renard   Fix nodeType for ...
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
270
			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...
271
272
273
274
275
276
277
278
279
280
			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...
281
282
				{

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

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

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

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

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

        foreach ($args as $tab)
6acb8d2a   Elena.Budnik   checkRequest in R...
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
351
		{
			$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...
352
353

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