Blame view

php/classes/RequestMgr.php 8.54 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
243
244
245
246
247
248
249
250
251
252
				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...
253
254
				{

6acb8d2a   Elena.Budnik   checkRequest in R...
255
256
257
258
259
260
261
					//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
262
263
				
				if (!empty($params))
6acb8d2a   Elena.Budnik   checkRequest in R...
264
				{
9b69cb35   Nathanael Jourdane   Implement batch m...
265
					// tab is not defined, iterate over $obj->tabs?
6acb8d2a   Elena.Budnik   checkRequest in R...
266
					$argsTab['param'] = array_unique($params);
0342cf46   Benjamin Renard   Fix download of I...
267
268
					$argsTab['startTime'] = $obj->startDate;
					$argsTab['stopTime'] = $obj->stopDate;
6acb8d2a   Elena.Budnik   checkRequest in R...
269
270
				}
				if (count($argsTab) > 0) $args[] = $argsTab;
9b69cb35   Nathanael Jourdane   Implement batch m...
271

6acb8d2a   Elena.Budnik   checkRequest in R...
272
				break;
5f7d3cff   Elena.Budnik   no description fo...
273
274
275
			case 'statistics' :
				return array('success' => true);
				break;
6acb8d2a   Elena.Budnik   checkRequest in R...
276
277
278
			default :
				return array('success' => false, 'message' => "unknown action ".$obj->nodeType);
		}
9b69cb35   Nathanael Jourdane   Implement batch m...
279
280
281

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

6acb8d2a   Elena.Budnik   checkRequest in R...
282
283
284
285
286
		try 
		{
			$client = new SoapClient(DD_WSDL);
		}
		catch  (SoapFault $exception)
9b69cb35   Nathanael Jourdane   Implement batch m...
287
		{
6acb8d2a   Elena.Budnik   checkRequest in R...
288
289
			return array('success' => false, 'message' => $exception->faultstring);
		}
9b69cb35   Nathanael Jourdane   Implement batch m...
290

6acb8d2a   Elena.Budnik   checkRequest in R...
291
292
293
		$orbitsXml = new DomDocument("1.0");
		$orbitsXml->load(orbitsAllXml);
		$tr = array('_' => ':');
9b69cb35   Nathanael Jourdane   Implement batch m...
294
295

        foreach ($args as $tab)
6acb8d2a   Elena.Budnik   checkRequest in R...
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
		{
			$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...
324
325

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