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
	public function getUploadedObject($name, $format, $onlyDescription = false)
	{
		if (strpos($name, '.txt') !== false || strpos($name, '.asc') !== false || strpos($name, '.') == false) {
e4fba9d2   Nathanaël Jourdane   Import tt: parse ...
246
			$attributesToReturn = $this->textToAmda(USERTEMPDIR . $name, $onlyDescription);
139a8045   Nathanaël Jourdane   autocleanup
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
			$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
	 */
e4fba9d2   Nathanaël Jourdane   Import tt: parse ...
326
	protected function textToAmda($tmp_file, $onlyDescription = false)
139a8045   Nathanaël Jourdane   autocleanup
327
	{
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) {
efb57954   Nathanaël Jourdane   Parse imported ti...
336
			$line = preg_replace('/\s+/', ' ', trim($line));
e4fba9d2   Nathanaël Jourdane   Import tt: parse ...
337
			if ($line[0] == '#') { // Comment
139a8045   Nathanaël Jourdane   autocleanup
338
339
				$description = $description . PHP_EOL . substr($line, 1, -1);
			} else {
e4fba9d2   Nathanaël Jourdane   Import tt: parse ...
340
341
				$isoFormat = 'Y-m-dTH:i:s';
				$doyFormat = 'Y z H i s';
eefe1e26   Nathanaël Jourdane   Improve DOY parsing
342
				$doyRegex = '(\d{4}) (\d{2,3}) (\d{2}) (\d{2}) (\d{2})( \d{2})?';
e4fba9d2   Nathanaël Jourdane   Import tt: parse ...
343

efb57954   Nathanaël Jourdane   Parse imported ti...
344
				if (preg_match('/^' . $doyRegex . ' ' . $doyRegex . '$/', $line)) {
a525e8c1   Nathanaël Jourdane   import tt: Substr...
345
346
347
348
					$start = DateTime::createFromFormat($doyFormat, substr($line, 0, 17));
					$stop = DateTime::createFromFormat($doyFormat, substr($line, 18));
					$startDate = $start->sub(new DateInterval('P1D'))->format($isoFormat);
					$stopDate = $stop->sub(new DateInterval('P1D'))->format($isoFormat);
e4fba9d2   Nathanaël Jourdane   Import tt: parse ...
349
				} else {
efb57954   Nathanaël Jourdane   Parse imported ti...
350
351
352
353
354
355
356
357
358
359
360
361
					$dateLength = round((strlen($line)-1) / 2);

					$startTime = strtotime(substr($line, 0, $dateLength));
					$stopTime = strtotime(substr($line, $dateLength + 1));
					if (is_numeric($startTime) && is_numeric($stopTime)) {
						$startDate = date($isoFormat, $startTime);
						$stopDate = date($isoFormat, $stopTime);
					} else {
						$description = $description . PHP_EOL . $line;
						$descNumber++;
						continue;
					}
4a438b99   elena   catalog draft
362
				}
139a8045   Nathanaël Jourdane   autocleanup
363

e4fba9d2   Nathanaël Jourdane   Import tt: parse ...
364
365
				if (!$onlyDescription) {
					$attributesToReturn['intervals'][] = ['start' => $startDate, 'stop' => $stopDate];
139a8045   Nathanaël Jourdane   autocleanup
366
				}
4a438b99   elena   catalog draft
367
			}
3ed056c4   Elena.Budnik   redmine #5278
368
		}
139a8045   Nathanaël Jourdane   autocleanup
369
		if ($recordsNumber == $descNumber) {
e4fba9d2   Nathanaël Jourdane   Import tt: parse ...
370
			$description = 'Looks like we can not read your time format...' . PHP_EOL . $description;
139a8045   Nathanaël Jourdane   autocleanup
371
372
		}

4a438b99   elena   catalog draft
373
		$attributesToReturn['description'] = $description;
139a8045   Nathanaël Jourdane   autocleanup
374
		$attributesToReturn['name'] = basename($tmp_file, '.' . $suffix[1]);
dca1b251   Elena.Budnik   non standard time...
375
		$attributesToReturn['created'] = date('Y-m-d\TH:i:s');
3ed056c4   Elena.Budnik   redmine #5278
376
		return $attributesToReturn;
16035364   Benjamin Renard   First commit
377
	}
6207ec14   Elena.Budnik   #5919 non standar...
378

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
379
380
381
382
383
384
	/**
	 * Convert VOTable time table to AMDA attributes
	 * @param $tmp_file
	 * @param bool $onlyDescription
	 * @return mixed
	 */
139a8045   Nathanaël Jourdane   autocleanup
385
386
387
388
	protected function vot2amda($tmp_file, $onlyDescription = false)
	{
		// Load Time table
		$this->objectDom->load($tmp_file);
3ed056c4   Elena.Budnik   redmine #5278
389
390
		$objToGet = $this->objectDom->getElementsByTagName('TABLEDATA')->item(0);
		$attributesToReturn['name'] = $tmp_file;
139a8045   Nathanaël Jourdane   autocleanup
391
		$attributes = $objToGet->childNodes;
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
392
393

		/** @var DOMElement $attribute */
139a8045   Nathanaël Jourdane   autocleanup
394
		foreach ($attributes as $attribute) {
3ed056c4   Elena.Budnik   redmine #5278
395
			if ($attribute->tagName == 'TR') {
139a8045   Nathanaël Jourdane   autocleanup
396
397
398
				$start = $attribute->getElementsByTagName('TD')->item(0)->nodeValue;
				$stop = $attribute->getElementsByTagName('TD')->item(1)->nodeValue;
				if (!$onlyDescription) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
399
					$attributesToReturn['intervals'][] = ['start' => $start, 'stop' => $stop];
139a8045   Nathanaël Jourdane   autocleanup
400
				}
3ed056c4   Elena.Budnik   redmine #5278
401
			}
139a8045   Nathanaël Jourdane   autocleanup
402
403
404
405
		}
		$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
406
407
		$description = $this->objectDom->getElementsByTagName('DESCRIPTION')->item(0)->nodeValue;
		$attributesToReturn['description'] = htmlspecialchars($description);
139a8045   Nathanaël Jourdane   autocleanup
408
		return ($attributesToReturn);
16035364   Benjamin Renard   First commit
409
	}
139a8045   Nathanaël Jourdane   autocleanup
410

16035364   Benjamin Renard   First commit
411
412
413
	/*****************************************************************
	 *                           PUBLIC FUNCTIONS
	 *****************************************************************/
139a8045   Nathanaël Jourdane   autocleanup
414

16035364   Benjamin Renard   First commit
415
416
417
	/*
	 *   Get Object into Edit
	 */
139a8045   Nathanaël Jourdane   autocleanup
418
419
420
421
	public function getTmpObject($folderId, $name, $onlyDescription = false)
	{
		$filePath = USERWORKINGDIR . $folderId . '/' . $name . '.xml';
		if (!file_exists($filePath)) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
422
			return ['error' => 'Cannot find result file'];
16035364   Benjamin Renard   First commit
423
		}
139a8045   Nathanaël Jourdane   autocleanup
424
425
426
427
428

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

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

139a8045   Nathanaël Jourdane   autocleanup
432
433
434
435
		$descNodes = $dom->getElementsByTagName('description');
		if ($descNodes->length > 0) {
			$attributesToReturn['description'] = $descNodes->item(0)->nodeValue;
		}
16035364   Benjamin Renard   First commit
436

139a8045   Nathanaël Jourdane   autocleanup
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
		$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
452
453

			/** @var DOMElement $intNode */
139a8045   Nathanaël Jourdane   autocleanup
454
455
456
			foreach ($intNodes as $intNode) {
				$startNodes = $intNode->getElementsByTagName('start');
				if ($startNodes->length <= 0) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
457
					return ['error' => 'Error detected in result file'];
139a8045   Nathanaël Jourdane   autocleanup
458
459
460
				}
				$stopNodes = $intNode->getElementsByTagName('stop');
				if ($stopNodes->length <= 0) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
461
					return ['error' => 'Error detected in result file'];
16035364   Benjamin Renard   First commit
462
				}
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
463
				$attributesToReturn['intervals'][] = [
139a8045   Nathanaël Jourdane   autocleanup
464
465
					'start' => $startNodes->item(0)->nodeValue,
					'stop' => $stopNodes->item(0)->nodeValue
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
466
				];
16035364   Benjamin Renard   First commit
467
			}
16035364   Benjamin Renard   First commit
468
		}
139a8045   Nathanaël Jourdane   autocleanup
469
470

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

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
473
474
475
476
477
	/**
	 * Merge time tables
	 * @param $obj
	 * @return array
	 */
139a8045   Nathanaël Jourdane   autocleanup
478
479
480
481
482
483
484
485
486
	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
487
488
489
490
491
		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
492
			}
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
493
			$intervals += count($interval[$iId]);
16035364   Benjamin Renard   First commit
494
		}
139a8045   Nathanaël Jourdane   autocleanup
495
496
497
498
		if ($intervals > 10000) {
			set_time_limit(1800);
		}

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
499
500
501
		$final = [];
		for ($iId = 0; $iId < count($obj->ids); $iId++) {
			$final = array_merge($final, $interval[$iId]);
139a8045   Nathanaël Jourdane   autocleanup
502
503
504
505
506
		}
		sort($final);

		// Algorithm of union
		$line = 0;
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
507
508
509
510
511
		$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
512
			} else {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
513
514
				if (($final[$iId + 1][0] <= $final[$iId][1]) && ($final[$iId + 1][1] >= $final[$iId][1])) {
					$iId++;
139a8045   Nathanaël Jourdane   autocleanup
515
				} else {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
516
517
518
					$start[$line] = $val;
					$stop[$line] = $final[$iId][1];
					$iId++;
139a8045   Nathanaël Jourdane   autocleanup
519
					$line++;
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
520
					$val = $final[$iId][0];
139a8045   Nathanaël Jourdane   autocleanup
521
				}
16035364   Benjamin Renard   First commit
522
			}
16035364   Benjamin Renard   First commit
523
		}
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
524
525
		$start[$line] = $val;
		$stop[$line] = $final[$iId][1];
139a8045   Nathanaël Jourdane   autocleanup
526
527
528
529
530
531
532

		$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
533
		for ($iId = 0; $iId < count($start); $iId++) {
139a8045   Nathanaël Jourdane   autocleanup
534
			$inter = new stdClass();
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
535
536
			$inter->start = $start[$iId];
			$inter->stop = $stop[$iId];
139a8045   Nathanaël Jourdane   autocleanup
537
538
539
540
541
542
			$objTT->intervals[] = $inter;
		}
		$objTT->nbIntervals = count($start);
		$this->objectDom = new DomDocument('1.0');
		$this->objectDom->formatOutput = true;

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
543
		$res = $this->createParameter($objTT, $folder); // FIXME $folder is undefined
139a8045   Nathanaël Jourdane   autocleanup
544
545
546
547
548
		if ($res['error']) {
			return $res;
		}

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

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
552
553
554
555
556
557
558
559
560
	/**
	 * 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
561
562
563
564
565
	{
		if ($typeTT == 'sharedtimeTable') {
			//Shared object
			$sharedObjMgr = new SharedObjectsMgr();
			$path = $sharedObjMgr->getDataFilePath('timeTable', $id);
139a8045   Nathanaël Jourdane   autocleanup
566
567
		} else {
			$path = USERTTDIR . $id . '.xml';
3ed056c4   Elena.Budnik   redmine #5278
568
		}
139a8045   Nathanaël Jourdane   autocleanup
569
570
571

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

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

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

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

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

			/** @var DOMElement $interval */
3ed056c4   Elena.Budnik   redmine #5278
588
589
			foreach ($intervals as $interval) {
				$startTime = $interval->getElementsByTagName('start')->item(0)->nodeValue;
139a8045   Nathanaël Jourdane   autocleanup
590
				$stopTime = $interval->getElementsByTagName('stop')->item(0)->nodeValue;
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
591
				array_push($result, ['start' => $startTime, 'stop' => $stopTime]);
3ed056c4   Elena.Budnik   redmine #5278
592
			}
139a8045   Nathanaël Jourdane   autocleanup
593
		} else {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
594
595
			for ($iInt = 0; $iInt < $limit; ++$iInt) {
				if ($start + $iInt >= $intervals->length) {
3ed056c4   Elena.Budnik   redmine #5278
596
					break;
139a8045   Nathanaël Jourdane   autocleanup
597
				}
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
598
599
600
				$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
601
			}
16035364   Benjamin Renard   First commit
602
		}
139a8045   Nathanaël Jourdane   autocleanup
603

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
604
		return [
139a8045   Nathanaël Jourdane   autocleanup
605
606
607
608
609
			'totalCount' => $intervals->length,
			'intervals' => $result,
			'start' => isset($start) ? $start : 0,
			'limit' => isset($limit) ? $limit : 0,
			'success' => true
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
610
		];
169f14d2   Benjamin Renard   Add shared object...
611
	}
139a8045   Nathanaël Jourdane   autocleanup
612

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
613
614
615
616
617
618
619
	/**
	 * Save intervals
	 * @param $id
	 * @param $intervals
	 * @param $action
	 * @return array
	 */
139a8045   Nathanaël Jourdane   autocleanup
620
	public function saveIntervals($id, $intervals, $action)
3ed056c4   Elena.Budnik   redmine #5278
621
	{
139a8045   Nathanaël Jourdane   autocleanup
622
		if (substr($id, 0, 6) == 'shared') {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
623
			return ['success' => false, 'message' => "Cannot save shared TimeTable"];
139a8045   Nathanaël Jourdane   autocleanup
624
625
626
627
		} else {
			$path = USERTTDIR . $id . '.xml';
		}
		if (!file_exists($path)) {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
628
			return ['success' => false, 'message' => "Cannot find TT file " . $id];
139a8045   Nathanaël Jourdane   autocleanup
629
630
631
632
		}
		$this->objectDom->load($path);

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

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

3ed056c4   Elena.Budnik   redmine #5278
639
		while ($crtNode) {
139a8045   Nathanaël Jourdane   autocleanup
640
			if (($crtNode->nodeType != XML_ELEMENT_NODE) || ($crtNode->tagName != 'intervals')) {
3ed056c4   Elena.Budnik   redmine #5278
641
642
643
644
645
646
647
648
				$crtNode = $crtNode->nextSibling;
				continue;
			}
			$toRemove = $crtNode;
			$crtNode = $crtNode->nextSibling;
			$objToGet->removeChild($toRemove);
			unset($toRemove);
		}
139a8045   Nathanaël Jourdane   autocleanup
649

3ed056c4   Elena.Budnik   redmine #5278
650
		//add new intervals
139a8045   Nathanaël Jourdane   autocleanup
651
652
		foreach ($intervals as $interval) {
			$newInterval = $this->createIntervalElement($interval);
3ed056c4   Elena.Budnik   redmine #5278
653
654
			$this->objectDom->documentElement->appendChild($newInterval);
		}
16035364   Benjamin Renard   First commit
655

3ed056c4   Elena.Budnik   redmine #5278
656
657
		//save modifications
		$this->id = $id;
139a8045   Nathanaël Jourdane   autocleanup
658
		$this->resFileName = USERTTDIR . $this->id . '.xml';
3ed056c4   Elena.Budnik   redmine #5278
659
		$this->objectDom->save($this->resFileName);
139a8045   Nathanaël Jourdane   autocleanup
660

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

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

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
666
667
668
669
670
	/**
	 * Create interval element
	 * @param $interval
	 * @return DOMElement
	 */
139a8045   Nathanaël Jourdane   autocleanup
671
	protected function createIntervalElement($interval)
3ed056c4   Elena.Budnik   redmine #5278
672
	{
139a8045   Nathanaël Jourdane   autocleanup
673
674
675
676
677
678
		$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
679
680
681
682
683
	/**
	 * Intersect time tables
	 * @param $obj
	 * @return array|string
	 */
139a8045   Nathanaël Jourdane   autocleanup
684
685
	public function intersect($obj)
	{
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
686
687
688
689
690
691
		$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
692
			}
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
693
			$intervals += count($interval[$iId]);
16035364   Benjamin Renard   First commit
694
		}
139a8045   Nathanaël Jourdane   autocleanup
695
696
		if ($intervals > 10000) {
			set_time_limit(1800);
16035364   Benjamin Renard   First commit
697
		}
16035364   Benjamin Renard   First commit
698

139a8045   Nathanaël Jourdane   autocleanup
699
700
701
		// Sort intervals in time tables
		sort($interval[0]);
		sort($interval[1]);
16035364   Benjamin Renard   First commit
702

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
703
704
		$iId = 0;
		$jId = 0;
139a8045   Nathanaël Jourdane   autocleanup
705
706
		$line = 0;

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
707
708
		while (($iId < count($interval[0])) && ($jId < count($interval[1]))) {
			$inter = $this->callIntersection($interval[0][$iId], $interval[1][$jId]);
139a8045   Nathanaël Jourdane   autocleanup
709
710
711
712
713
714
715

			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
716
717
			if ($interval[0][$iId][1] < $interval[1][$jId][1]) {
				$iId++;
139a8045   Nathanaël Jourdane   autocleanup
718
			} else {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
719
				$jId++;
139a8045   Nathanaël Jourdane   autocleanup
720
721
722
723
724
725
726
			}
		}

		// Intersection is empty
		if ($line == 0) {
			$result = "empty";
		} else {
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
727
			$objTT->name = $obj->name;  // FIXME $objTT is undefined
139a8045   Nathanaël Jourdane   autocleanup
728
729
730
731
			$objTT->nodeType = 'timeTable';
			$objTT->leaf = true;
			$objTT->created = null;
			$objTT->history = $obj->history;
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
732
			for ($iId = 0; $iId < count($start); $iId++) {
139a8045   Nathanaël Jourdane   autocleanup
733
				$inter = new stdClass();
d8ec1623   Nathanaël Jourdane   fix phpcs warnings
734
735
				$inter->start = $start[$iId];
				$inter->stop = $stop[$iId];
139a8045   Nathanaël Jourdane   autocleanup
736
737
738
739
740
741
742
743
744
				$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
745
				$result = $this->createObject($objTT, $folder); // FIXME $folder is undefined
139a8045   Nathanaël Jourdane   autocleanup
746
747
748

				if (!isset($result['error'])) {
					$this->saveIntervals($result['id'], $objTT->intervals, 'intersect');
3ed056c4   Elena.Budnik   redmine #5278
749
				}
16035364   Benjamin Renard   First commit
750
			}
3ed056c4   Elena.Budnik   redmine #5278
751
		}
139a8045   Nathanaël Jourdane   autocleanup
752
753
754
		return $result;
	}

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
755
756
757
758
759
760
761
	/**
	 * Call intersection
	 * @param $fst
	 * @param $snd
	 * @return array
	 */
	protected function callIntersection($fst, $snd)
139a8045   Nathanaël Jourdane   autocleanup
762
763
764
	{
		$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
765
		$inter[] = ($inf >= $sup) ? [0, 0] : [$inf, $sup];
139a8045   Nathanaël Jourdane   autocleanup
766
		return $inter;
16035364   Benjamin Renard   First commit
767
768
	}

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
769
770
771
772
773
774
775
	/**
	 * Valid name object
	 * TODO getObject only!!!! => change DD_Search output
	 * @param $p
	 * @return array
	 */
	public function validNameObject($p)
139a8045   Nathanaël Jourdane   autocleanup
776
777
778
779
780
781
782
783
784
785
	{
		// overwritten
		$res = parent::validNameObject($p);

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

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

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

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
792
793
794
795
796
797
798
799
800
	/**
	 * Copy time table
	 * @param $src_path
	 * @param $dst_path
	 * @param $newId
	 * @param $newName
	 * @param null $newDescription
	 * @return bool
	 */
139a8045   Nathanaël Jourdane   autocleanup
801
	public function copyTT($src_path, $dst_path, $newId, $newName, $newDescription = null)
3ed056c4   Elena.Budnik   redmine #5278
802
	{
139a8045   Nathanaël Jourdane   autocleanup
803
804
805
806
807
808
809
810
		if (!file_exists($src_path)) {
			return false;
		}

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

169f14d2   Benjamin Renard   Add shared object...
811
812
		$dom = new DomDocument('1.0');
		$dom->formatOutput = true;
139a8045   Nathanaël Jourdane   autocleanup
813
814
815
816
817

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

169f14d2   Benjamin Renard   Add shared object...
818
		$timeTableNodes = $dom->getElementsByTagName('timetable');
139a8045   Nathanaël Jourdane   autocleanup
819
820
821
822
		if ($timeTableNodes->length <= 0) {
			return false;
		}

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

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

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

247b38e9   Benjamin Renard   Fix function used...
829
		if ($nameNodes->length <= 0) {
169f14d2   Benjamin Renard   Add shared object...
830
831
832
			//create name node (normally never append)
			$nameNode = $dom->createElement('name');
			$timeTableNode->appendChild($nameNode);
139a8045   Nathanaël Jourdane   autocleanup
833
		} else {
169f14d2   Benjamin Renard   Add shared object...
834
			$nameNode = $nameNodes->item(0);
139a8045   Nathanaël Jourdane   autocleanup
835
836
		}

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

09eefb2d   Benjamin Renard   Shared TT and Cat...
839
840
		if (isset($newDescription) && !empty($newDescription)) {
			$descriptionNodes = $timeTableNode->getElementsByTagName('description');
247b38e9   Benjamin Renard   Fix function used...
841
			if ($descriptionNodes->length <= 0) {
09eefb2d   Benjamin Renard   Shared TT and Cat...
842
843
844
				//create description node (normally never append)
				$descriptionNode = $dom->createElement('description');
				$timeTableNode->appendChild($descriptionNode);
139a8045   Nathanaël Jourdane   autocleanup
845
			} else {
09eefb2d   Benjamin Renard   Shared TT and Cat...
846
				$descriptionNode = $descriptionNodes->item(0);
139a8045   Nathanaël Jourdane   autocleanup
847
848
			}

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

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
852
853
		$dstFilePath = $dst_path . "/" . $newId . ".xml";
		if ($dom->save($dstFilePath) === false) {
139a8045   Nathanaël Jourdane   autocleanup
854
855
856
			return false;
		}

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
857
858
		chgrp($dstFilePath, APACHE_USER);
		chmod($dstFilePath, 0775);
139a8045   Nathanaël Jourdane   autocleanup
859
860
861
862

		return true;
	}

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
863
864
865
866
867
	/**
	 * Rename in resource
	 * @param $name
	 * @param $id
	 * @return bool
139a8045   Nathanaël Jourdane   autocleanup
868
	 */
139a8045   Nathanaël Jourdane   autocleanup
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
	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
885
886
887
888
	/**
	 * Delete parameter
	 * @param $id
	 */
139a8045   Nathanaël Jourdane   autocleanup
889
890
891
892
893
894
895
	protected function deleteParameter($id)
	{
		if (file_exists(USERTTDIR . $id . '.xml')) {
			unlink(USERTTDIR . $id . '.xml');
		}
	}

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
896
897
898
899
900
	/**
	 * Rename only
	 * @param $p
	 * @return bool
	 */
139a8045   Nathanaël Jourdane   autocleanup
901
902
903
904
	protected function renameOnly($p)
	{
		//if (!($p->intervals)) return true;
		return false;
3ed056c4   Elena.Budnik   redmine #5278
905
	}
16035364   Benjamin Renard   First commit
906
}