Blame view

php/classes/TimeTableMgr.php 24.7 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) {
bea3673d   Benjamin Renard   Fix uploaded TT p...
336
			$line = 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 {
bea3673d   Benjamin Renard   Fix uploaded TT p...
340
				$line = preg_replace('/[-:\/T\s]+/', ' ', $line);
e4fba9d2   Nathanaël Jourdane   Import tt: parse ...
341
342
				$isoFormat = 'Y-m-dTH:i:s';
				$doyFormat = 'Y z H i s';
f9b34ed9   Nathanaël Jourdane   import : parse da...
343
				$doyRegex = '(\d{4}) (\d{3}) (\d{2}) (\d{2}) (\d{2})( \d{2})?';
e4fba9d2   Nathanaël Jourdane   Import tt: parse ...
344

efb57954   Nathanaël Jourdane   Parse imported ti...
345
				if (preg_match('/^' . $doyRegex . ' ' . $doyRegex . '$/', $line)) {
a525e8c1   Nathanaël Jourdane   import tt: Substr...
346
347
348
349
					$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 ...
350
				} else {
efb57954   Nathanaël Jourdane   Parse imported ti...
351
352
					$dateLength = round((strlen($line)-1) / 2);

f9b34ed9   Nathanaël Jourdane   import : parse da...
353
354
355
356
357
					$start = explode(' ', substr($line, 0, $dateLength) . ' 00');
					$startTime = strtotime("$start[0]/$start[1]/$start[2] $start[3]:$start[4]:$start[5]");

					$stop = explode(' ', substr($line, $dateLength + 1) . ' 00');
					$stopTime = strtotime("$stop[0]/$stop[1]/$stop[2] $stop[3]:$stop[4]:$stop[5]");
efb57954   Nathanaël Jourdane   Parse imported ti...
358
359
360
361
362
363
364
365
					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
366
				}
139a8045   Nathanaël Jourdane   autocleanup
367

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

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

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

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

16035364   Benjamin Renard   First commit
415
416
417
	/*****************************************************************
	 *                           PUBLIC FUNCTIONS
	 *****************************************************************/
139a8045   Nathanaël Jourdane   autocleanup
418

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

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

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

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

139a8045   Nathanaël Jourdane   autocleanup
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
		$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
456
457

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

139a8045   Nathanaël Jourdane   autocleanup
703
704
705
		// Sort intervals in time tables
		sort($interval[0]);
		sort($interval[1]);
16035364   Benjamin Renard   First commit
706

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
707
708
		$iId = 0;
		$jId = 0;
139a8045   Nathanaël Jourdane   autocleanup
709
710
		$line = 0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

d8ec1623   Nathanaël Jourdane   fix phpcs warnings
861
862
		chgrp($dstFilePath, APACHE_USER);
		chmod($dstFilePath, 0775);
139a8045   Nathanaël Jourdane   autocleanup
863
864
865
866

		return true;
	}

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

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