Blame view

php/classes/TimeTableMgr.php 24.5 KB
16035364   Benjamin Renard   First commit
1
2
3
4
5
6
7
8
9
<?php

/**
 * @class TimeTableMgr
 * @version $Id: TimeTableMgr.php 2809 2015-03-05 09:50:52Z natacha $
 * @todo MANAGE TT created by Search and Plot interactive - HERE?
 *
 */

4a438b99   elena   catalog draft
10
class TimeTableMgr extends AmdaObjectMgr
139a8045   Nathanaël Jourdane   autocleanup
11
{
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
12
13
14
15
16
17
	/**
	 * TimeTableMgr constructor.
	 * @param null $user The user
	 * @param bool $sharedObject Shared object
	 */
	public function __construct($user = null, $sharedObject = false)
4a438b99   elena   catalog draft
18
	{
16035364   Benjamin Renard   First commit
19
20
21
		parent::__construct('Tt.xml');
		$this->contentRootId = 'timeTable-treeRootNode';
		$this->contentRootTag = 'timetabList';
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
22
23
		$this->attributes = ['name' => '', 'intervals' => ''];
		$this->optionalAttributes = [];
16035364   Benjamin Renard   First commit
24
25
26
		$this->objTagName = 'timetab';
		$this->id_prefix = 'tt_';

169f14d2   Benjamin Renard   Add shared object...
27
		if (!$sharedObject && !file_exists($this->xmlName)) {
139a8045   Nathanaël Jourdane   autocleanup
28
29
			$this->createDom();
			$this->xp = new domxpath($this->contentDom);
16035364   Benjamin Renard   First commit
30
31
		}
	}
139a8045   Nathanaël Jourdane   autocleanup
32
33

	protected function createDom()
3ed056c4   Elena.Budnik   redmine #5278
34
	{
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
35
		$types = ['timetab' => 'timeTable', 'catalog' => 'catalog'];
16035364   Benjamin Renard   First commit
36
37

		$rootElement = $this->contentDom->createElement('ws');
139a8045   Nathanaël Jourdane   autocleanup
38

3ed056c4   Elena.Budnik   redmine #5278
39
		foreach ($types as $key => $value) {
139a8045   Nathanaël Jourdane   autocleanup
40
41
			$contentId = $value . '-treeRootNode';
			$contentTag = $key . 'List';
3ed056c4   Elena.Budnik   redmine #5278
42
43
44
			$typeElement = $this->contentDom->createElement($contentTag);
			$typeElement->setAttribute('xml:id', $contentId);
			$rootElement->appendChild($typeElement);
16035364   Benjamin Renard   First commit
45
		}
4a438b99   elena   catalog draft
46
		$this->contentDom->appendChild($rootElement);
16035364   Benjamin Renard   First commit
47
		$this->contentDom->save($this->xmlName);
3ed056c4   Elena.Budnik   redmine #5278
48
	}
16035364   Benjamin Renard   First commit
49

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
50
51
52
53
54
55
56
	/**
	 * Get object
	 * @param $id
	 * @param $nodeType
	 * @return array
	 */
	public function getObject($id, $nodeType = null)
4a438b99   elena   catalog draft
57
	{
139a8045   Nathanaël Jourdane   autocleanup
58
59
60
61
62
63
64
		if (substr($nodeType, 0, 6) == 'shared') {
			//Shared object
			$sharedObjMgr = new SharedObjectsMgr();
			$path = $sharedObjMgr->getDataFilePath(str_replace('shared', '', $nodeType), $id);
		} else {
			$path = USERTTDIR . $id . '.xml';
		}
16035364   Benjamin Renard   First commit
65

139a8045   Nathanaël Jourdane   autocleanup
66
		if (!file_exists($path)) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
67
			return ['error' => NO_OBJECT_FILE];
139a8045   Nathanaël Jourdane   autocleanup
68
69
70
		}
		$this->objectDom->load($path);
		if (!($objToGet = $this->objectDom->getElementById($id))) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
71
			return ['error' => NO_SUCH_ID];
139a8045   Nathanaël Jourdane   autocleanup
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
		}
		$attributesToReturn['id'] = $objToGet->getAttribute('xml:id');
		$attributes = $objToGet->childNodes;

		$nbInt = 0;
		foreach ($attributes as $attribute) {
			if ($attribute->nodeType == XML_ELEMENT_NODE) {
				/*if ($attribute->tagName == 'intervals') {
					$start = $attribute -> getElementsByTagName('start')->item(0) -> nodeValue;
					$stop = $attribute -> getElementsByTagName('stop')->item(0) -> nodeValue;
					$attributesToReturn['intervals'][] = array('start' => $start, 'stop' => $stop);
				}
				else
				$attributesToReturn[$attribute->tagName] =  $attribute->nodeValue;*/
				//BRE - load all except intervals - Intervals will be loaded later with 'loadIntervalsFromTT' function
				if ($attribute->tagName != 'intervals') {
					$attributesToReturn[$attribute->tagName] = $attribute->nodeValue;
				} else {
					$nbInt++;
				}
			}
		}
139a8045   Nathanaël Jourdane   autocleanup
94
95
96
		$attributesToReturn['nbIntervals'] = $nbInt;

		return $attributesToReturn;
16035364   Benjamin Renard   First commit
97
98
	}

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
99
100
101
102
103
	/**
	 * Modify an object
	 * @param $p
	 * @return array
	 */
139a8045   Nathanaël Jourdane   autocleanup
104
	public function modifyObject($p)
4a438b99   elena   catalog draft
105
	{
139a8045   Nathanaël Jourdane   autocleanup
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
		$folder = $this->getObjectFolder($p->id);

		//Copy TT in a tempory file
		$ttFilePath = USERTTDIR . $p->id . '.xml';
		$tmpFileExist = false;
		if (file_exists($ttFilePath)) {
			$tmpFileExist = copy($ttFilePath, $ttFilePath . ".tmp");
		}

		//Delete TT
		$this->deleteObject($p);

		//Save modifications
		try {
			$result = $this->createObject($p, $folder);
			if ($result['error']) {
				throw new Exception($result['error']);
			}
			if ($tmpFileExist) {
				unlink($ttFilePath . ".tmp");
			}
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
127
128
			return ['id' => $p->id, 'info' => $result['info']];
		} catch (Exception $exception) {
139a8045   Nathanaël Jourdane   autocleanup
129
130
131
132
133
			//Restore TT file
			if ($tmpFileExist) {
				copy($ttFilePath . ".tmp", $ttFilePath);
				unlink($ttFilePath . ".tmp");
			}
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
134
			return ['error' => $exception->getMessage()];
139a8045   Nathanaël Jourdane   autocleanup
135
		}
16035364   Benjamin Renard   First commit
136
137
	}

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
138
139
140
141
142
143
	/**
	 * Create an object
	 * @param $p
	 * @param $folder
	 * @return array
	 */
139a8045   Nathanaël Jourdane   autocleanup
144
145
146
147
148
149
150
151
152
153
154
155
	public function createObject($p, $folder)
	{
		if ($p->leaf) {
			$result = $this->createParameter($p, $folder);
			if ($result['error']) {
				return $result;
			}
			$cacheMgr = new TimeTableCacheMgr();
			if (isset($p->cacheToken) && ($p->cacheToken != '')) {
				$resultSaveInt = $cacheMgr->saveInTT($result['id'], "update", $p->cacheToken);
				if (!$resultSaveInt['success']) {
					if ($resultSaveInt['message']) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
156
						return ['error' => $resultSaveInt['message']];
139a8045   Nathanaël Jourdane   autocleanup
157
					} else {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
158
						return ['error' => 'Unknown error during intervals save'];
139a8045   Nathanaël Jourdane   autocleanup
159
160
161
162
					}
				}
			}
			return $result;
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
163
164
165
166
		} else {
			return ['error' => 'createFolder should be called from RENAME'];
			// return $this->createFolder($p);
			// TODO check if this is possible?
139a8045   Nathanaël Jourdane   autocleanup
167
		}
16035364   Benjamin Renard   First commit
168
	}
16035364   Benjamin Renard   First commit
169

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
170
171
172
173
174
175
	/**
	 * Create parameter (in case of catalogs)
	 * @param $p
	 * @param $folder
	 * @return array
	 */
4a438b99   elena   catalog draft
176
177
	protected function createParameter($p, $folder)
	{
139a8045   Nathanaël Jourdane   autocleanup
178
179
180
		if ($this->objectExistsByName($p->name)) {
			$p->id = $this->getObjectIdByName($p->name);
			$this->deleteObject($p);
16035364   Benjamin Renard   First commit
181
		}
139a8045   Nathanaël Jourdane   autocleanup
182

16035364   Benjamin Renard   First commit
183
184
		$this->id = $this->setId();
		$this->created = date('Y-m-d\TH:i:s');
139a8045   Nathanaël Jourdane   autocleanup
185
		if (!$this->id) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
186
			return ['error' => ID_CREATION_ERROR];
139a8045   Nathanaël Jourdane   autocleanup
187
188
189
		}

		$this->resFileName = USERTTDIR . $this->id . '.xml';
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
190
		// TODO catalog root element = 'timetable'
16035364   Benjamin Renard   First commit
191
		$rootElement = $this->objectDom->createElement('timetable');
139a8045   Nathanaël Jourdane   autocleanup
192
193
194
		$rootElement->setAttribute('xml:id', $this->id);

		foreach ($p as $key => $value) {
3ed056c4   Elena.Budnik   redmine #5278
195
196
			if ($key != 'id' && $key != 'leaf' && $key != 'nodeType' &&
				$key != 'objName' && $key != 'objFormat' && $key != 'folderId' && $key != 'cacheToken') {
139a8045   Nathanaël Jourdane   autocleanup
197
198
199
200
201
202
203
204
205
				if ($key == 'created') {
					$rootElement->appendChild($this->objectDom->createElement($key, $this->created));
				} // it is catalog
				else {
					if ($key == 'parameters') {
						$paramsElement = $this->setParamDescription($value);
						if ($paramsElement) {
							$rootElement->appendChild($paramsElement);
						}
139a8045   Nathanaël Jourdane   autocleanup
206
207
208
209
					} else {
						if ($key != 'intervals') {
							$rootElement->appendChild($this->objectDom->createElement($key, htmlspecialchars($value)));
						}
3ed056c4   Elena.Budnik   redmine #5278
210
					}
139a8045   Nathanaël Jourdane   autocleanup
211
				}
d18b535d   elena   catalog draft + c...
212
			}
139a8045   Nathanaël Jourdane   autocleanup
213
		}
16035364   Benjamin Renard   First commit
214
215
216
217
218
219

		$this->objectDom->appendChild($rootElement);
		$this->objectDom->save($this->resFileName);
		$obj = new stdClass();
		$obj->name = $p->name;
		$obj->intervals = $p->nbIntervals;
139a8045   Nathanaël Jourdane   autocleanup
220
		$this->addToContent($obj, $folder);
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
221
222
		// FIXME field created is undefined
		return ['id' => $this->id, 'created' => $this->created, 'info' => $obj->intervals . ' intervals'];
16035364   Benjamin Renard   First commit
223
224
	}

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
225
226
227
228
229
	/**
	 * Set parameter description
	 * TODO
	 * @param $param string The parameter
	 * @return DOMNode
139a8045   Nathanaël Jourdane   autocleanup
230
	 */
139a8045   Nathanaël Jourdane   autocleanup
231
	protected function setParamDescription($param)
4a438b99   elena   catalog draft
232
	{
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
233
		return new DOMNode();
4a438b99   elena   catalog draft
234
	}
139a8045   Nathanaël Jourdane   autocleanup
235

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
236
237
238
239
240
241
242
	/**
	 * Get uploaded object
	 * @param $name
	 * @param $format
	 * @param bool $onlyDescription
	 * @return mixed
	 */
139a8045   Nathanaël Jourdane   autocleanup
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
	public function getUploadedObject($name, $format, $onlyDescription = false)
	{
		if (strpos($name, '.txt') !== false || strpos($name, '.asc') !== false || strpos($name, '.') == false) {
			$attributesToReturn = $this->text2amda(USERTEMPDIR . $name, $onlyDescription);
			$attributesToReturn['objName'] = $name;
			$attributesToReturn['objFormat'] = $format;

			return $attributesToReturn;
		}

		if ($format == 'VOT') {
			$attributesToReturn = $this->vot2amda(USERTEMPDIR . $name, $onlyDescription);
			$attributesToReturn['objName'] = $name;
			$attributesToReturn['objFormat'] = $format;

			return $attributesToReturn;
		}

		if (strpos($name, '.xml') !== false) {
			$temp = explode('.xml', $name);
			$name = $temp[0];
		}

		if (!file_exists(USERTEMPDIR . $name . '.xml')) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
267
			return ['error' => 'no such name'];
139a8045   Nathanaël Jourdane   autocleanup
268
269
270
271
272
		}

		$this->objectDom->load(USERTEMPDIR . $name . '.xml');
		if (!($objToGet = $this->objectDom->getElementsByTagName('timetable')->item(0)) &&
			!($objToGet = $this->objectDom->getElementsByTagName('TimeTable')->item(0))) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
273
			return ['error' => 'no time table'];
139a8045   Nathanaël Jourdane   autocleanup
274
275
276
277
278
279
280
		}

		$attributes = $objToGet->childNodes;
		$attributesToReturn['name'] = $name;
		$attributesToReturn['objName'] = $name;
		$attributesToReturn['objFormat'] = $format;

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
281
		/** @var DOMElement $attribute */
139a8045   Nathanaël Jourdane   autocleanup
282
283
284
285
286
287
		foreach ($attributes as $attribute) {
			if ($attribute->nodeType == XML_ELEMENT_NODE) {
				if ($attribute->tagName == 'intervals') {
					$start = $attribute->getElementsByTagName('start')->item(0)->nodeValue;
					$stop = $attribute->getElementsByTagName('stop')->item(0)->nodeValue;
					if (!$onlyDescription) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
288
						$attributesToReturn['intervals'][] = ['start' => $start, 'stop' => $stop];
139a8045   Nathanaël Jourdane   autocleanup
289
290
291
292
293
294
					}
				} else {
					if ($attribute->tagName == 'Interval') {
						$start = $attribute->getElementsByTagName('Start')->item(0)->nodeValue;
						$stop = $attribute->getElementsByTagName('Stop')->item(0)->nodeValue;
						if (!$onlyDescription) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
295
							$attributesToReturn['intervals'][] = ['start' => $start, 'stop' => $stop];
139a8045   Nathanaël Jourdane   autocleanup
296
297
298
						}
					} else {
						switch (strtolower($attribute->tagName)) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
299
							case 'created':
139a8045   Nathanaël Jourdane   autocleanup
300
301
								$attributesToReturn['created'] = $attribute->nodeValue;
								break;
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
302
303
							case 'chain':
							case 'source':
139a8045   Nathanaël Jourdane   autocleanup
304
305
306
307
308
309
310
311
312
313
314
315
								$attributesToReturn['description'] = $attribute->nodeValue;
								break;
							default:
								break;
						}
					}
				}
			}
		}
		return $attributesToReturn;
	}

3ed056c4   Elena.Budnik   redmine #5278
316
317
318
	/*
	* Uploaded text file => convert to array
	*/
139a8045   Nathanaël Jourdane   autocleanup
319

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
320
321
322
323
324
325
	/**
	 * Convert text to AMDA attributes
	 * @param $tmp_file
	 * @param bool $onlyDescription
	 * @return mixed
	 */
139a8045   Nathanaël Jourdane   autocleanup
326
327
	protected function text2amda($tmp_file, $onlyDescription = false)
	{
4a438b99   elena   catalog draft
328
		$suffix = explode('.', basename($tmp_file));
139a8045   Nathanaël Jourdane   autocleanup
329
330
		$lines = file($tmp_file, FILE_SKIP_EMPTY_LINES);
		$description = "Uploaded Time Table" . PHP_EOL;
4a438b99   elena   catalog draft
331

f8cd7d84   Elena.Budnik   error msg if cann...
332
333
		$recordsNumber = count($lines);
		$descNumber = 0;
139a8045   Nathanaël Jourdane   autocleanup
334
335

		foreach ($lines as $line) {
6207ec14   Elena.Budnik   #5919 non standar...
336
			if ($line[0] == '#') {
139a8045   Nathanaël Jourdane   autocleanup
337
338
339
340
				$description = $description . PHP_EOL . substr($line, 1, -1);
			} else {
				$date = explode(' ', trim(preg_replace('!\s+!', ' ', $line)));

4a438b99   elena   catalog draft
341
				if (!strtotime(trim($date[0]))) {
139a8045   Nathanaël Jourdane   autocleanup
342
					$description = $description . PHP_EOL . $line;
f8cd7d84   Elena.Budnik   error msg if cann...
343
					$descNumber++;
4a438b99   elena   catalog draft
344
345
					continue;
				}
3ed056c4   Elena.Budnik   redmine #5278
346
				// check if it is ISO format
139a8045   Nathanaël Jourdane   autocleanup
347
				if (!isset($isIso)) {
6207ec14   Elena.Budnik   #5919 non standar...
348
					$isIso = preg_match('/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})$/', trim($date[0]));
139a8045   Nathanaël Jourdane   autocleanup
349
350
				}

3ed056c4   Elena.Budnik   redmine #5278
351
				if (!$isIso) {
6207ec14   Elena.Budnik   #5919 non standar...
352
353
354
355
356
					// y-m-d h:m:s for example
					$dateLength = count($date) / 2;

					$tempStart = $date[0];
					$tempStop = $date[$dateLength];
139a8045   Nathanaël Jourdane   autocleanup
357

6207ec14   Elena.Budnik   #5919 non standar...
358
					if ($dateLength > 1) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
359
360
						for ($iDate = 1; $iDate < $dateLength; $iDate++) {
							$tempStart .= $date[$iDate];
139a8045   Nathanaël Jourdane   autocleanup
361
362
						}

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
363
364
						for ($iDate = $dateLength + 1; $iDate < $dateLength * 2; $iDate++) {
							$tempStop .= $date[$iDate];
139a8045   Nathanaël Jourdane   autocleanup
365
						}
6207ec14   Elena.Budnik   #5919 non standar...
366
367
					}

139a8045   Nathanaël Jourdane   autocleanup
368
369
370
371
					$startDate = date('Y-m-d\TH:i:s', strtotime($tempStart));
					$stopDate = date('Y-m-d\TH:i:s', strtotime($tempStop));

					if (!$onlyDescription) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
372
						$attributesToReturn['intervals'][] = ['start' => $startDate, 'stop' => $stopDate];
139a8045   Nathanaël Jourdane   autocleanup
373
374
375
					}
				} else {
					if (!$onlyDescription) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
376
						$attributesToReturn['intervals'][] = ['start' => trim($date[0]), 'stop' => trim($date[1])];
139a8045   Nathanaël Jourdane   autocleanup
377
378
					}
				}
4a438b99   elena   catalog draft
379
			}
3ed056c4   Elena.Budnik   redmine #5278
380
		}
139a8045   Nathanaël Jourdane   autocleanup
381
382
383
384
		if ($recordsNumber == $descNumber) {
			$description = "Looks like we can not read your time format..." . PHP_EOL . $description;
		}

4a438b99   elena   catalog draft
385
		$attributesToReturn['description'] = $description;
139a8045   Nathanaël Jourdane   autocleanup
386
		$attributesToReturn['name'] = basename($tmp_file, '.' . $suffix[1]);
dca1b251   Elena.Budnik   non standard time...
387
		$attributesToReturn['created'] = date('Y-m-d\TH:i:s');
16035364   Benjamin Renard   First commit
388

3ed056c4   Elena.Budnik   redmine #5278
389
		return $attributesToReturn;
16035364   Benjamin Renard   First commit
390
	}
6207ec14   Elena.Budnik   #5919 non standar...
391

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
392
393
394
395
396
397
	/**
	 * Convert VOTable time table to AMDA attributes
	 * @param $tmp_file
	 * @param bool $onlyDescription
	 * @return mixed
	 */
139a8045   Nathanaël Jourdane   autocleanup
398
399
400
401
	protected function vot2amda($tmp_file, $onlyDescription = false)
	{
		// Load Time table
		$this->objectDom->load($tmp_file);
3ed056c4   Elena.Budnik   redmine #5278
402
403
		$objToGet = $this->objectDom->getElementsByTagName('TABLEDATA')->item(0);
		$attributesToReturn['name'] = $tmp_file;
139a8045   Nathanaël Jourdane   autocleanup
404
		$attributes = $objToGet->childNodes;
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
405
406

		/** @var DOMElement $attribute */
139a8045   Nathanaël Jourdane   autocleanup
407
		foreach ($attributes as $attribute) {
3ed056c4   Elena.Budnik   redmine #5278
408
			if ($attribute->tagName == 'TR') {
139a8045   Nathanaël Jourdane   autocleanup
409
410
411
				$start = $attribute->getElementsByTagName('TD')->item(0)->nodeValue;
				$stop = $attribute->getElementsByTagName('TD')->item(1)->nodeValue;
				if (!$onlyDescription) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
412
					$attributesToReturn['intervals'][] = ['start' => $start, 'stop' => $stop];
139a8045   Nathanaël Jourdane   autocleanup
413
				}
3ed056c4   Elena.Budnik   redmine #5278
414
			}
139a8045   Nathanaël Jourdane   autocleanup
415
416
417
418
		}
		$suffix = explode('.', basename($tmp_file));
		$attributesToReturn['name'] = basename($tmp_file, '.' . $suffix[1]);
		$attributesToReturn['created'] = date('Y-m-d') . "T" . date('H:i:s');
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
419
420
		$description = $this->objectDom->getElementsByTagName('DESCRIPTION')->item(0)->nodeValue;
		$attributesToReturn['description'] = htmlspecialchars($description);
139a8045   Nathanaël Jourdane   autocleanup
421
		return ($attributesToReturn);
16035364   Benjamin Renard   First commit
422
	}
139a8045   Nathanaël Jourdane   autocleanup
423

16035364   Benjamin Renard   First commit
424
425
426
	/*****************************************************************
	 *                           PUBLIC FUNCTIONS
	 *****************************************************************/
139a8045   Nathanaël Jourdane   autocleanup
427

16035364   Benjamin Renard   First commit
428
429
430
	/*
	 *   Get Object into Edit
	 */
139a8045   Nathanaël Jourdane   autocleanup
431
432
433
434
	public function getTmpObject($folderId, $name, $onlyDescription = false)
	{
		$filePath = USERWORKINGDIR . $folderId . '/' . $name . '.xml';
		if (!file_exists($filePath)) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
435
			return ['error' => 'Cannot find result file'];
16035364   Benjamin Renard   First commit
436
		}
139a8045   Nathanaël Jourdane   autocleanup
437
438
439
440
441

		$dom = new DomDocument('1.0');
		$dom->formatOutput = true;

		if (!$dom->load($filePath)) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
442
			return ['error' => 'Cannot load result file'];
16035364   Benjamin Renard   First commit
443
444
		}

139a8045   Nathanaël Jourdane   autocleanup
445
446
447
448
		$descNodes = $dom->getElementsByTagName('description');
		if ($descNodes->length > 0) {
			$attributesToReturn['description'] = $descNodes->item(0)->nodeValue;
		}
16035364   Benjamin Renard   First commit
449

139a8045   Nathanaël Jourdane   autocleanup
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
		$creatNodes = $dom->getElementsByTagName('created');
		if ($creatNodes->length > 0) {
			$attributesToReturn['created'] = $creatNodes->item(0)->nodeValue;
		}

		$histNodes = $dom->getElementsByTagName('history');
		if ($histNodes->length > 0) {
			$attributesToReturn['history'] = $histNodes->item(0)->nodeValue;
		}

		$attributesToReturn['objName'] = $name;
		$attributesToReturn['folderId'] = $folderId;

		if (!$onlyDescription) {
			$intNodes = $dom->getElementsByTagName('intervals');
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
465
466

			/** @var DOMElement $intNode */
139a8045   Nathanaël Jourdane   autocleanup
467
468
469
			foreach ($intNodes as $intNode) {
				$startNodes = $intNode->getElementsByTagName('start');
				if ($startNodes->length <= 0) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
470
					return ['error' => 'Error detected in result file'];
139a8045   Nathanaël Jourdane   autocleanup
471
472
473
				}
				$stopNodes = $intNode->getElementsByTagName('stop');
				if ($stopNodes->length <= 0) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
474
					return ['error' => 'Error detected in result file'];
16035364   Benjamin Renard   First commit
475
				}
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
476
				$attributesToReturn['intervals'][] = [
139a8045   Nathanaël Jourdane   autocleanup
477
478
					'start' => $startNodes->item(0)->nodeValue,
					'stop' => $stopNodes->item(0)->nodeValue
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
479
				];
16035364   Benjamin Renard   First commit
480
			}
16035364   Benjamin Renard   First commit
481
		}
139a8045   Nathanaël Jourdane   autocleanup
482
483

		return $attributesToReturn;
16035364   Benjamin Renard   First commit
484
	}
139a8045   Nathanaël Jourdane   autocleanup
485

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
486
487
488
489
490
	/**
	 * Merge time tables
	 * @param $obj
	 * @return array
	 */
139a8045   Nathanaël Jourdane   autocleanup
491
492
493
494
495
496
497
498
499
	public function merge($obj)
	{
		/**
		 * Array of intervals, used like :
		 * [{start:'2010-01-01T23:00:00',stop:'2011-01-01T20:00:00'},{start:'2009-01-01T23:00:00',stop:'2010-01-01T20:00:00'}]
		 * $attributesToReturn['intervals'][] = array('start' => $start, 'stop' => $stop);
		 */

		$intervals = 0;
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
500
501
502
503
504
		for ($iId = 0; $iId < count($obj->ids); $iId++) {
			$table[$iId] = $this->loadIntervalsFromTT($obj->ids[$iId]);
			for ($jId = 0; $jId < count($table[$iId]['intervals']); $jId++) {
				$interval[$iId][$jId][0] = $table[$iId]['intervals'][$jId]['start'];
				$interval[$iId][$jId][1] = $table[$iId]['intervals'][$jId]['stop'];
139a8045   Nathanaël Jourdane   autocleanup
505
			}
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
506
			$intervals += count($interval[$iId]);
16035364   Benjamin Renard   First commit
507
		}
139a8045   Nathanaël Jourdane   autocleanup
508
509
510
511
		if ($intervals > 10000) {
			set_time_limit(1800);
		}

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
512
513
514
		$final = [];
		for ($iId = 0; $iId < count($obj->ids); $iId++) {
			$final = array_merge($final, $interval[$iId]);
139a8045   Nathanaël Jourdane   autocleanup
515
516
517
518
519
		}
		sort($final);

		// Algorithm of union
		$line = 0;
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
520
521
522
523
524
		$iId = 0;
		$val = $final[$iId][0];
		while ($iId < count($final) - 1) {
			if ($final[$iId + 1][1] <= $final[$iId][1]) {
				array_splice($final, $iId + 1, 1);
139a8045   Nathanaël Jourdane   autocleanup
525
			} else {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
526
527
				if (($final[$iId + 1][0] <= $final[$iId][1]) && ($final[$iId + 1][1] >= $final[$iId][1])) {
					$iId++;
139a8045   Nathanaël Jourdane   autocleanup
528
				} else {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
529
530
531
					$start[$line] = $val;
					$stop[$line] = $final[$iId][1];
					$iId++;
139a8045   Nathanaël Jourdane   autocleanup
532
					$line++;
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
533
					$val = $final[$iId][0];
139a8045   Nathanaël Jourdane   autocleanup
534
				}
16035364   Benjamin Renard   First commit
535
			}
16035364   Benjamin Renard   First commit
536
		}
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
537
538
		$start[$line] = $val;
		$stop[$line] = $final[$iId][1];
139a8045   Nathanaël Jourdane   autocleanup
539
540
541
542
543
544
545

		$objTT = new stdClass();
		$objTT->name = $obj->name;
		$objTT->nodeType = 'timeTable';
		$objTT->leaf = true;
		$objTT->created = null;
		$objTT->history = $obj->history;
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
546
		for ($iId = 0; $iId < count($start); $iId++) {
139a8045   Nathanaël Jourdane   autocleanup
547
			$inter = new stdClass();
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
548
549
			$inter->start = $start[$iId];
			$inter->stop = $stop[$iId];
139a8045   Nathanaël Jourdane   autocleanup
550
551
552
553
554
555
			$objTT->intervals[] = $inter;
		}
		$objTT->nbIntervals = count($start);
		$this->objectDom = new DomDocument('1.0');
		$this->objectDom->formatOutput = true;

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
556
		$res = $this->createParameter($objTT, $folder); // FIXME $folder is undefined
139a8045   Nathanaël Jourdane   autocleanup
557
558
559
560
561
		if ($res['error']) {
			return $res;
		}

		$this->saveIntervals($res['id'], $objTT->intervals, 'merge');
139a8045   Nathanaël Jourdane   autocleanup
562
		return $res;
16035364   Benjamin Renard   First commit
563
	}
139a8045   Nathanaël Jourdane   autocleanup
564

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
565
566
567
568
569
570
571
572
573
	/**
	 * Load intervals from time table
	 * @param $id
	 * @param $typeTT
	 * @param null $start
	 * @param null $limit
	 * @return array
	 */
	public function loadIntervalsFromTT($id, $typeTT = '', $start = null, $limit = null)
3ed056c4   Elena.Budnik   redmine #5278
574
575
576
577
578
	{
		if ($typeTT == 'sharedtimeTable') {
			//Shared object
			$sharedObjMgr = new SharedObjectsMgr();
			$path = $sharedObjMgr->getDataFilePath('timeTable', $id);
139a8045   Nathanaël Jourdane   autocleanup
579
580
		} else {
			$path = USERTTDIR . $id . '.xml';
3ed056c4   Elena.Budnik   redmine #5278
581
		}
139a8045   Nathanaël Jourdane   autocleanup
582
583
584

		//load intervals from TT id
		if (!file_exists($path)) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
585
			return ['success' => false, 'message' => "Cannot find TT file " . $id];
139a8045   Nathanaël Jourdane   autocleanup
586
587
588
589
		}

		$this->objectDom->load($path);
		if (!($objToGet = $this->objectDom->getElementById($id))) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
590
			return ['success' => false, 'message' => NO_SUCH_ID . " " . $id];
139a8045   Nathanaël Jourdane   autocleanup
591
592
		}

3ed056c4   Elena.Budnik   redmine #5278
593
		$xpath = new DOMXPath($this->objectDom);
139a8045   Nathanaël Jourdane   autocleanup
594
595
		$intervals = $xpath->query('//intervals');

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
596
		$result = [];
139a8045   Nathanaël Jourdane   autocleanup
597

3ed056c4   Elena.Budnik   redmine #5278
598
		if (!isset($start) || !isset($limit)) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
599
600

			/** @var DOMElement $interval */
3ed056c4   Elena.Budnik   redmine #5278
601
602
			foreach ($intervals as $interval) {
				$startTime = $interval->getElementsByTagName('start')->item(0)->nodeValue;
139a8045   Nathanaël Jourdane   autocleanup
603
				$stopTime = $interval->getElementsByTagName('stop')->item(0)->nodeValue;
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
604
				array_push($result, ['start' => $startTime, 'stop' => $stopTime]);
3ed056c4   Elena.Budnik   redmine #5278
605
			}
139a8045   Nathanaël Jourdane   autocleanup
606
		} else {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
607
608
			for ($iInt = 0; $iInt < $limit; ++$iInt) {
				if ($start + $iInt >= $intervals->length) {
3ed056c4   Elena.Budnik   redmine #5278
609
					break;
139a8045   Nathanaël Jourdane   autocleanup
610
				}
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
611
612
613
				$startTime = $intervals->item($start + $iInt)->getElementsByTagName('start')->item(0)->nodeValue;
				$stopTime = $intervals->item($start + $iInt)->getElementsByTagName('stop')->item(0)->nodeValue;
				array_push($result, ['start' => $startTime, 'stop' => $stopTime]);
3ed056c4   Elena.Budnik   redmine #5278
614
			}
16035364   Benjamin Renard   First commit
615
		}
139a8045   Nathanaël Jourdane   autocleanup
616

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
617
		return [
139a8045   Nathanaël Jourdane   autocleanup
618
619
620
621
622
			'totalCount' => $intervals->length,
			'intervals' => $result,
			'start' => isset($start) ? $start : 0,
			'limit' => isset($limit) ? $limit : 0,
			'success' => true
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
623
		];
169f14d2   Benjamin Renard   Add shared object...
624
	}
139a8045   Nathanaël Jourdane   autocleanup
625

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
626
627
628
629
630
631
632
	/**
	 * Save intervals
	 * @param $id
	 * @param $intervals
	 * @param $action
	 * @return array
	 */
139a8045   Nathanaël Jourdane   autocleanup
633
	public function saveIntervals($id, $intervals, $action)
3ed056c4   Elena.Budnik   redmine #5278
634
	{
139a8045   Nathanaël Jourdane   autocleanup
635
		if (substr($id, 0, 6) == 'shared') {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
636
			return ['success' => false, 'message' => "Cannot save shared TimeTable"];
139a8045   Nathanaël Jourdane   autocleanup
637
638
639
640
		} else {
			$path = USERTTDIR . $id . '.xml';
		}
		if (!file_exists($path)) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
641
			return ['success' => false, 'message' => "Cannot find TT file " . $id];
139a8045   Nathanaël Jourdane   autocleanup
642
643
644
645
		}
		$this->objectDom->load($path);

		if (!($objToGet = $this->objectDom->getElementById($id))) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
646
			return ['success' => false, 'message' => NO_SUCH_ID . " " . $id];
3ed056c4   Elena.Budnik   redmine #5278
647
		}
16035364   Benjamin Renard   First commit
648

3ed056c4   Elena.Budnik   redmine #5278
649
650
		//remove old intervals
		$crtNode = $objToGet->firstChild;
139a8045   Nathanaël Jourdane   autocleanup
651

3ed056c4   Elena.Budnik   redmine #5278
652
		while ($crtNode) {
139a8045   Nathanaël Jourdane   autocleanup
653
			if (($crtNode->nodeType != XML_ELEMENT_NODE) || ($crtNode->tagName != 'intervals')) {
3ed056c4   Elena.Budnik   redmine #5278
654
655
656
657
658
659
660
661
				$crtNode = $crtNode->nextSibling;
				continue;
			}
			$toRemove = $crtNode;
			$crtNode = $crtNode->nextSibling;
			$objToGet->removeChild($toRemove);
			unset($toRemove);
		}
139a8045   Nathanaël Jourdane   autocleanup
662

3ed056c4   Elena.Budnik   redmine #5278
663
		//add new intervals
139a8045   Nathanaël Jourdane   autocleanup
664
665
		foreach ($intervals as $interval) {
			$newInterval = $this->createIntervalElement($interval);
3ed056c4   Elena.Budnik   redmine #5278
666
667
			$this->objectDom->documentElement->appendChild($newInterval);
		}
16035364   Benjamin Renard   First commit
668

3ed056c4   Elena.Budnik   redmine #5278
669
670
		//save modifications
		$this->id = $id;
139a8045   Nathanaël Jourdane   autocleanup
671
		$this->resFileName = USERTTDIR . $this->id . '.xml';
3ed056c4   Elena.Budnik   redmine #5278
672
		$this->objectDom->save($this->resFileName);
139a8045   Nathanaël Jourdane   autocleanup
673

3ed056c4   Elena.Budnik   redmine #5278
674
		unset($this->objectDom);
139a8045   Nathanaël Jourdane   autocleanup
675

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
676
		return ['success' => true, 'action' => $action, 'nbIntervals' => count($intervals)];
3ed056c4   Elena.Budnik   redmine #5278
677
	}
139a8045   Nathanaël Jourdane   autocleanup
678

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
679
680
681
682
683
	/**
	 * Create interval element
	 * @param $interval
	 * @return DOMElement
	 */
139a8045   Nathanaël Jourdane   autocleanup
684
	protected function createIntervalElement($interval)
3ed056c4   Elena.Budnik   redmine #5278
685
	{
139a8045   Nathanaël Jourdane   autocleanup
686
687
688
689
690
691
		$newInterval = $this->objectDom->createElement('intervals');
		$newInterval->appendChild($this->objectDom->createElement('start', $interval->start));
		$newInterval->appendChild($this->objectDom->createElement('stop', $interval->stop));
		return $newInterval;
	}

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
692
693
694
695
696
	/**
	 * Intersect time tables
	 * @param $obj
	 * @return array|string
	 */
139a8045   Nathanaël Jourdane   autocleanup
697
698
	public function intersect($obj)
	{
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
699
700
701
702
703
704
		$intervals = 0;
		for ($iId = 0; $iId < count($obj->ids); $iId++) {
			$table[$iId] = $this->loadIntervalsFromTT($obj->ids[$iId]);
			for ($jId = 0; $jId < count($table[$iId]['intervals']); $jId++) {
				$interval[$iId][$jId][0] = $table[$iId]['intervals'][$jId]['start'];
				$interval[$iId][$jId][1] = $table[$iId]['intervals'][$jId]['stop'];
139a8045   Nathanaël Jourdane   autocleanup
705
			}
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
706
			$intervals += count($interval[$iId]);
16035364   Benjamin Renard   First commit
707
		}
139a8045   Nathanaël Jourdane   autocleanup
708
709
		if ($intervals > 10000) {
			set_time_limit(1800);
16035364   Benjamin Renard   First commit
710
		}
16035364   Benjamin Renard   First commit
711

139a8045   Nathanaël Jourdane   autocleanup
712
713
714
		// Sort intervals in time tables
		sort($interval[0]);
		sort($interval[1]);
16035364   Benjamin Renard   First commit
715

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
716
717
		$iId = 0;
		$jId = 0;
139a8045   Nathanaël Jourdane   autocleanup
718
719
		$line = 0;

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
720
721
		while (($iId < count($interval[0])) && ($jId < count($interval[1]))) {
			$inter = $this->callIntersection($interval[0][$iId], $interval[1][$jId]);
139a8045   Nathanaël Jourdane   autocleanup
722
723
724
725
726
727
728

			if ($inter[0][0] != 0 && $inter[0][1] != 0) {
				$start[$line] = $inter[0][0];
				$stop[$line] = $inter[0][1];
				$line++;
			}

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
729
730
			if ($interval[0][$iId][1] < $interval[1][$jId][1]) {
				$iId++;
139a8045   Nathanaël Jourdane   autocleanup
731
			} else {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
732
				$jId++;
139a8045   Nathanaël Jourdane   autocleanup
733
734
735
736
737
738
739
			}
		}

		// Intersection is empty
		if ($line == 0) {
			$result = "empty";
		} else {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
740
			$objTT->name = $obj->name;  // FIXME $objTT is undefined
139a8045   Nathanaël Jourdane   autocleanup
741
742
743
744
			$objTT->nodeType = 'timeTable';
			$objTT->leaf = true;
			$objTT->created = null;
			$objTT->history = $obj->history;
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
745
			for ($iId = 0; $iId < count($start); $iId++) {
139a8045   Nathanaël Jourdane   autocleanup
746
				$inter = new stdClass();
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
747
748
				$inter->start = $start[$iId];
				$inter->stop = $stop[$iId];
139a8045   Nathanaël Jourdane   autocleanup
749
750
751
752
753
754
755
756
757
				$objTT->intervals[] = $inter;
			}
			$objTT->nbIntervals = count($start);

			if (count($objTT->intervals) == 0) {
				$result = "empty";
			} else {
				$this->objectDom = new DomDocument('1.0');
				$this->objectDom->formatOutput = true;
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
758
				$result = $this->createObject($objTT, $folder); // FIXME $folder is undefined
139a8045   Nathanaël Jourdane   autocleanup
759
760
761

				if (!isset($result['error'])) {
					$this->saveIntervals($result['id'], $objTT->intervals, 'intersect');
3ed056c4   Elena.Budnik   redmine #5278
762
				}
16035364   Benjamin Renard   First commit
763
			}
3ed056c4   Elena.Budnik   redmine #5278
764
		}
139a8045   Nathanaël Jourdane   autocleanup
765
766
767
		return $result;
	}

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
768
769
770
771
772
773
774
	/**
	 * Call intersection
	 * @param $fst
	 * @param $snd
	 * @return array
	 */
	protected function callIntersection($fst, $snd)
139a8045   Nathanaël Jourdane   autocleanup
775
776
777
	{
		$inf = ($fst[0] > $snd[0]) ? $fst[0] : $snd[0];
		$sup = ($fst[1] < $snd[1]) ? $fst[1] : $snd[1];
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
778
		$inter[] = ($inf >= $sup) ? [0, 0] : [$inf, $sup];
139a8045   Nathanaël Jourdane   autocleanup
779
		return $inter;
16035364   Benjamin Renard   First commit
780
781
	}

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
782
783
784
785
786
787
788
	/**
	 * Valid name object
	 * TODO getObject only!!!! => change DD_Search output
	 * @param $p
	 * @return array
	 */
	public function validNameObject($p)
139a8045   Nathanaël Jourdane   autocleanup
789
790
791
792
793
794
795
796
797
798
	{
		// overwritten
		$res = parent::validNameObject($p);

		if (!$res['valid']) {
			return $res;
		}

		//no space
		if (strpos($p->name, ' ') === false) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
799
			return ['valid' => true];
16035364   Benjamin Renard   First commit
800
		}
139a8045   Nathanaël Jourdane   autocleanup
801

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
802
		return ['valid' => false, 'error' => 'Space character is not allowed'];
16035364   Benjamin Renard   First commit
803
804
	}

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
805
806
807
808
809
810
811
812
813
	/**
	 * Copy time table
	 * @param $src_path
	 * @param $dst_path
	 * @param $newId
	 * @param $newName
	 * @param null $newDescription
	 * @return bool
	 */
139a8045   Nathanaël Jourdane   autocleanup
814
	public function copyTT($src_path, $dst_path, $newId, $newName, $newDescription = null)
3ed056c4   Elena.Budnik   redmine #5278
815
	{
139a8045   Nathanaël Jourdane   autocleanup
816
817
818
819
820
821
822
823
		if (!file_exists($src_path)) {
			return false;
		}

		if (!is_dir($dst_path)) {
			return false;
		}

169f14d2   Benjamin Renard   Add shared object...
824
825
		$dom = new DomDocument('1.0');
		$dom->formatOutput = true;
139a8045   Nathanaël Jourdane   autocleanup
826
827
828
829
830

		if (!$dom->load($src_path)) {
			return false;
		}

169f14d2   Benjamin Renard   Add shared object...
831
		$timeTableNodes = $dom->getElementsByTagName('timetable');
139a8045   Nathanaël Jourdane   autocleanup
832
833
834
835
		if ($timeTableNodes->length <= 0) {
			return false;
		}

169f14d2   Benjamin Renard   Add shared object...
836
		$timeTableNode = $timeTableNodes->item(0);
139a8045   Nathanaël Jourdane   autocleanup
837

169f14d2   Benjamin Renard   Add shared object...
838
		$timeTableNode->setAttribute('xml:id', $newId);
139a8045   Nathanaël Jourdane   autocleanup
839

169f14d2   Benjamin Renard   Add shared object...
840
		$nameNodes = $timeTableNode->getElementsByTagName('name');
139a8045   Nathanaël Jourdane   autocleanup
841

247b38e9   Benjamin Renard   Fix function used...
842
		if ($nameNodes->length <= 0) {
169f14d2   Benjamin Renard   Add shared object...
843
844
845
			//create name node (normally never append)
			$nameNode = $dom->createElement('name');
			$timeTableNode->appendChild($nameNode);
139a8045   Nathanaël Jourdane   autocleanup
846
		} else {
169f14d2   Benjamin Renard   Add shared object...
847
			$nameNode = $nameNodes->item(0);
139a8045   Nathanaël Jourdane   autocleanup
848
849
		}

169f14d2   Benjamin Renard   Add shared object...
850
		$nameNode->nodeValue = $newName;
139a8045   Nathanaël Jourdane   autocleanup
851

09eefb2d   Benjamin Renard   Shared TT and Cat...
852
853
		if (isset($newDescription) && !empty($newDescription)) {
			$descriptionNodes = $timeTableNode->getElementsByTagName('description');
247b38e9   Benjamin Renard   Fix function used...
854
			if ($descriptionNodes->length <= 0) {
09eefb2d   Benjamin Renard   Shared TT and Cat...
855
856
857
				//create description node (normally never append)
				$descriptionNode = $dom->createElement('description');
				$timeTableNode->appendChild($descriptionNode);
139a8045   Nathanaël Jourdane   autocleanup
858
			} else {
09eefb2d   Benjamin Renard   Shared TT and Cat...
859
				$descriptionNode = $descriptionNodes->item(0);
139a8045   Nathanaël Jourdane   autocleanup
860
861
			}

09eefb2d   Benjamin Renard   Shared TT and Cat...
862
863
			$descriptionNode->nodeValue = $newDescription;
		}
139a8045   Nathanaël Jourdane   autocleanup
864

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
865
866
		$dstFilePath = $dst_path . "/" . $newId . ".xml";
		if ($dom->save($dstFilePath) === false) {
139a8045   Nathanaël Jourdane   autocleanup
867
868
869
			return false;
		}

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
870
871
		chgrp($dstFilePath, APACHE_USER);
		chmod($dstFilePath, 0775);
139a8045   Nathanaël Jourdane   autocleanup
872
873
874
875

		return true;
	}

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
876
877
878
879
880
	/**
	 * Rename in resource
	 * @param $name
	 * @param $id
	 * @return bool
139a8045   Nathanaël Jourdane   autocleanup
881
	 */
139a8045   Nathanaël Jourdane   autocleanup
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
	protected function renameInResource($name, $id)
	{
		if (!file_exists(USERTTDIR . $id . '.xml')) {
			return false;
		}

		$this->objectDom->load(USERTTDIR . $id . '.xml');
		if (!($objToRename = $this->objectDom->getElementById($id))) {
			return false;
		}
		$objToRename->getElementsByTagName('name')->item(0)->nodeValue = $name;
		$this->objectDom->save(USERTTDIR . $id . '.xml');

		return true;
	}

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
898
899
900
901
	/**
	 * Delete parameter
	 * @param $id
	 */
139a8045   Nathanaël Jourdane   autocleanup
902
903
904
905
906
907
908
	protected function deleteParameter($id)
	{
		if (file_exists(USERTTDIR . $id . '.xml')) {
			unlink(USERTTDIR . $id . '.xml');
		}
	}

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
909
910
911
912
913
	/**
	 * Rename only
	 * @param $p
	 * @return bool
	 */
139a8045   Nathanaël Jourdane   autocleanup
914
915
916
917
	protected function renameOnly($p)
	{
		//if (!($p->intervals)) return true;
		return false;
3ed056c4   Elena.Budnik   redmine #5278
918
	}
16035364   Benjamin Renard   First commit
919
}