Merged
Merge Request #19
·
created by
Fix import
From
fix-import
into
master
-
Added 63 new commits:
- 4d8812b3 - Merge branch 'master' of gitlab1.irap.omp.eu:CDPP/AMDA_IHM
- d173bd15 - modif page accueil et css
- d95e8421 - ws transfer : initial
- 8e40a14d - new vars in desktop
- cdf22cdd - message window corrected, files transfer corrected
- 6a449df8 - message format
- 7034023d - infoMsgLong class with scrollbar
- 3aab6027 - help first update
- 6586e8e0 - Prefered => Preferred
- d00ae159 - help second commit
- 25d64015 - css h3
- 2bdc0416 - ABC
- 52c272ad - data download
- 00f75d44 - small format
- 311d79dc - downTT
- 4cf89268 - plot screenshots
- 3acc31af - plot screenshots
- eeb73206 - plotobjects
- ae53a73f - plotobjects
- c071d3b4 - plotPage
- cedf0315 - plotLayout
- 655e355f - disable "predefined" form fields
- 7d5742d0 - cdf attribute info
- 75a3182b - special MyDataParamNode methods - from InteractiveNode.js to MyDataParamNode.js
- 19955040 - sort MyData params alphabetically
- 3d7c42ed - disable fields predefined, add attributes
- 8f00a4d9 - correct GlobalStart GlobalStop
- fe516999 - nc attributes
- a5c6d5eb - \0 for char attribute
- 73625886 - added auto, manual sampling definition for all formats, cleaned up code extjs
- 7d539a8c - server side modifs
- b530f31f - remote sites from json
- 905a78e2 - numberfield for sampling
- 38ec1ca0 - Merge branch 'master' into upload_cdf_upgrade
- 48a8a598 - merge with master
- 8a2ebb69 - Merge branch 'upload_cdf_upgrade' into 'master'
- 1798cae0 - delete obsolete
- 05961422 - permissions on dirs
- a0ca0101 - permissions dir
- a57a2aa5 - Merge branch 'remote_bases' into 'master'
- cb36b2fe - proper dirs perms
- 410b9d9f - chmod
- f1ff330b - https is not implemented for URL file size definition
- d5e126d3 - Fix typo
- cb32ce86 - mkdir PATAMS in case of THEMIS
- b99f1ab7 - no MAPSKP
- 4414dcad - mkdir Remotedata/PARAMS
- 23b555f1 - help : remote: observations
- 514ba959 - tt help updated
- d77eac71 - operation tt help updated
- a32b79f8 - typo
- 9fb65ac8 - help layout draft
- cc9c44ec - layuot help corr
- 90ffaaa5 - layout and fonts
- 209e557c - change range help
- 0e03919b - Add min, max, var, median, rms, skew, ceil, floor, fix and sign functions
- ab55087c - idl => math
- 04eef959 - Merge branch 'master' into ws_transfert
- 167bd1f8 - Merge branch 'ws_transfert' into 'master'
- 08a89462 - convert old user ws
- e1e55d6e - small modifs
- 7edcc42d - merge master
- 42356ea1 - Merge branch 'master' into fix-import
-
Status changed to merged
-
mentioned in commit 090d1bc7c0956772aa28680e540f482d4a9834a5
27 Jun, 2018
2 commits
26 Jun, 2018
3 commits
25 Jun, 2018
1 commit
14 Jun, 2018
1 commit
11 Jun, 2018
1 commit
01 Jun, 2018
3 commits
31 May, 2018
3 commits
30 May, 2018
1 commit
Showing
4 changed files
Show diff stats
js/.eslintrc.yml
@@ -7,18 +7,17 @@ plugins: | @@ -7,18 +7,17 @@ plugins: | ||
7 | - extjs | 7 | - extjs |
8 | rules: | 8 | rules: |
9 | indent: [error, 2, SwitchCase: 1] | 9 | indent: [error, 2, SwitchCase: 1] |
10 | - semi: [warn, never] | 10 | + semi: [error, always] |
11 | max-len: [error, code: 120] | 11 | max-len: [error, code: 120] |
12 | - max-lines: [error, 600] | 12 | + max-lines: [warn, 600] |
13 | linebreak-style: [error, unix] | 13 | linebreak-style: [error, unix] |
14 | quotes: [error, single] | 14 | quotes: [error, single] |
15 | strict: [error, global] | 15 | strict: [error, global] |
16 | quote-props: [error, as-needed] | 16 | quote-props: [error, as-needed] |
17 | max-statements: [warn, 20] | 17 | max-statements: [warn, 20] |
18 | - array-bracket-newline: [warn, consistent] | ||
19 | consistent-this: [error, me] | 18 | consistent-this: [error, me] |
20 | padded-blocks: off | 19 | padded-blocks: off |
21 | - no-tabs: off | 20 | + newline-per-chained-call: [error, ignoreChainWithDepth: 3] |
22 | no-warning-comments: off | 21 | no-warning-comments: off |
23 | func-names: off | 22 | func-names: off |
24 | function-paren-newline: off | 23 | function-paren-newline: off |
php/classes/AmdaAction.php
@@ -594,6 +594,9 @@ class AmdaAction | @@ -594,6 +594,9 @@ class AmdaAction | ||
594 | */ | 594 | */ |
595 | public function getUploadedObject($name, $format, $nodeType) | 595 | public function getUploadedObject($name, $format, $nodeType) |
596 | { | 596 | { |
597 | + $fileContent = preg_replace(['~\R~u', "/\t/"], ["\n", ' '], trim(file_get_contents(USERTEMPDIR . $name))); | ||
598 | + file_put_contents(USERTEMPDIR . $name, $fileContent); | ||
599 | + | ||
597 | switch ($nodeType) | 600 | switch ($nodeType) |
598 | { | 601 | { |
599 | case 'timeTable' : | 602 | case 'timeTable' : |
php/classes/FilesMgr.php
@@ -277,9 +277,9 @@ class FilesMgr extends AmdaObjectMgr | @@ -277,9 +277,9 @@ class FilesMgr extends AmdaObjectMgr | ||
277 | $handler = fopen($this->fileName, 'r'); | 277 | $handler = fopen($this->fileName, 'r'); |
278 | if ($handler) { | 278 | if ($handler) { |
279 | while (!feof($handler) && !$StartTime) { | 279 | while (!feof($handler) && !$StartTime) { |
280 | - $oneLine = trim(fgets($handler)); | ||
281 | - $elems = explode(" ", preg_replace('/\s+/', ' ', $oneLine)); | ||
282 | - if ((strlen($elems[0]) < 16) || !($time = strtotime($elems[0]))) { | 280 | + $oneLine = trim(preg_replace('/\s+/', ' ', fgets($handler))); |
281 | + $elems = explode(' ', $oneLine); | ||
282 | + if ((strlen($elems[0]) < 16) || !($time = strtotime($elems[0]))) { | ||
283 | $i++; | 283 | $i++; |
284 | continue; | 284 | continue; |
285 | } | 285 | } |
@@ -291,8 +291,9 @@ class FilesMgr extends AmdaObjectMgr | @@ -291,8 +291,9 @@ class FilesMgr extends AmdaObjectMgr | ||
291 | 291 | ||
292 | if (feof($handler)) return -10; | 292 | if (feof($handler)) return -10; |
293 | 293 | ||
294 | - $oneLine = trim(fgets($handler)); | ||
295 | - $elems = explode(" ",$oneLine); | 294 | + $oneLine = trim(preg_replace('/\s+/', ' ', fgets($handler))); |
295 | + $elems = explode(' ',$oneLine); | ||
296 | + | ||
296 | if (count($elems) < 2) return -10; | 297 | if (count($elems) < 2) return -10; |
297 | 298 | ||
298 | // dT else Array | 299 | // dT else Array |
@@ -313,8 +314,8 @@ class FilesMgr extends AmdaObjectMgr | @@ -313,8 +314,8 @@ class FilesMgr extends AmdaObjectMgr | ||
313 | if ($handler) { | 314 | if ($handler) { |
314 | $i = 0; | 315 | $i = 0; |
315 | while (!feof($handler) && !$StartTime) { | 316 | while (!feof($handler) && !$StartTime) { |
316 | - $oneLine = trim(fgets($handler)); | ||
317 | - $elems = explode(" ", preg_replace('/\s+/', ' ', $oneLine)); | 317 | + $oneLine = trim(preg_replace('/\s+/', ' ', fgets($handler))); |
318 | + $elems = explode(' ',$oneLine); | ||
318 | if (strlen($elems[0]) < 16 || !($time = strtotime($elems[0]))) { | 319 | if (strlen($elems[0]) < 16 || !($time = strtotime($elems[0]))) { |
319 | $i++; | 320 | $i++; |
320 | continue; | 321 | continue; |
@@ -327,8 +328,8 @@ class FilesMgr extends AmdaObjectMgr | @@ -327,8 +328,8 @@ class FilesMgr extends AmdaObjectMgr | ||
327 | } | 328 | } |
328 | 329 | ||
329 | if (feof($handle)) return array(-10); | 330 | if (feof($handle)) return array(-10); |
330 | - $oneLine = trim(fgets($handler)); | ||
331 | - $elems = explode(" ",$oneLine); | 331 | + $oneLine = trim(preg_replace('/\s+/', ' ', fgets($handler))); |
332 | + $elems = explode(' ',$oneLine); | ||
332 | if (count($elems) < 2) return array (-1); | 333 | if (count($elems) < 2) return array (-1); |
333 | // dT else Array | 334 | // dT else Array |
334 | if (!($time = strtotime($elems[0]))) | 335 | if (!($time = strtotime($elems[0]))) |
@@ -340,8 +341,9 @@ class FilesMgr extends AmdaObjectMgr | @@ -340,8 +341,9 @@ class FilesMgr extends AmdaObjectMgr | ||
340 | 341 | ||
341 | while (!feof($handler)) | 342 | while (!feof($handler)) |
342 | { | 343 | { |
343 | - $oneLine = trim(fgets($handler)); | ||
344 | - $elems = explode(" ",$oneLine); | 344 | + $oneLine = trim(preg_replace('/\s+/', ' ', fgets($handler))); |
345 | + $elems = explode(' ',$oneLine); | ||
346 | + | ||
345 | if (count($elems) < 2) continue; | 347 | if (count($elems) < 2) continue; |
346 | $StartTime = $time; | 348 | $StartTime = $time; |
347 | if (!($time = strtotime($elems[0]))) return array(-1); | 349 | if (!($time = strtotime($elems[0]))) return array(-1); |
@@ -374,8 +376,9 @@ class FilesMgr extends AmdaObjectMgr | @@ -374,8 +376,9 @@ class FilesMgr extends AmdaObjectMgr | ||
374 | $i = 0; | 376 | $i = 0; |
375 | while (!$StartTime && !feof($handler)) | 377 | while (!$StartTime && !feof($handler)) |
376 | { | 378 | { |
377 | - $oneLine = trim(fgets($handler)); | ||
378 | - $elems = explode(" ", preg_replace('/\s+/', ' ', $oneLine)); | 379 | + $oneLine = trim(preg_replace('/\s+/', ' ', fgets($handler))); |
380 | + $elems = explode(' ',$oneLine); | ||
381 | + | ||
379 | if (!($time = strtotime($elems[0]))) | 382 | if (!($time = strtotime($elems[0]))) |
380 | { | 383 | { |
381 | $offset = ftell($handler); | 384 | $offset = ftell($handler); |
@@ -388,9 +391,10 @@ class FilesMgr extends AmdaObjectMgr | @@ -388,9 +391,10 @@ class FilesMgr extends AmdaObjectMgr | ||
388 | } | 391 | } |
389 | 392 | ||
390 | $newfile = fopen(USERDATADIR."temp", "w"); | 393 | $newfile = fopen(USERDATADIR."temp", "w"); |
391 | - | ||
392 | - $oneLine = trim(fgets($handler)); | ||
393 | - $elems = explode(" " , $oneLine); | 394 | + |
395 | + $oneLine = trim(preg_replace('/\s+/', ' ', fgets($handler))); | ||
396 | + $elems = explode(' ',$oneLine); | ||
397 | + | ||
394 | // dT | 398 | // dT |
395 | if (!($time = strtotime($elems[0]))) | 399 | if (!($time = strtotime($elems[0]))) |
396 | { | 400 | { |
@@ -400,8 +404,8 @@ class FilesMgr extends AmdaObjectMgr | @@ -400,8 +404,8 @@ class FilesMgr extends AmdaObjectMgr | ||
400 | $newtime += $dt; | 404 | $newtime += $dt; |
401 | 405 | ||
402 | while (!feof($handler)) | 406 | while (!feof($handler)) |
403 | - { | ||
404 | - $oneLine = trim(fgets($handler)); | 407 | + { |
408 | + $oneLine = trim(preg_replace('/\s+/', ' ', fgets($handler))); | ||
405 | if ($oneLine != PHP_EOL && count($elems) > 0) fwrite($newfile, $newtime." ".$oneLine.PHP_EOL); | 409 | if ($oneLine != PHP_EOL && count($elems) > 0) fwrite($newfile, $newtime." ".$oneLine.PHP_EOL); |
406 | $newtime += $dt; | 410 | $newtime += $dt; |
407 | } | 411 | } |
@@ -411,9 +415,9 @@ class FilesMgr extends AmdaObjectMgr | @@ -411,9 +415,9 @@ class FilesMgr extends AmdaObjectMgr | ||
411 | { | 415 | { |
412 | fseek($handler, $offset); | 416 | fseek($handler, $offset); |
413 | while (!feof($handler)) | 417 | while (!feof($handler)) |
414 | - { | ||
415 | - $oneLine = trim(fgets($handler)); | ||
416 | - $elems = explode(" " ,$oneLine); | 418 | + { |
419 | + $oneLine = trim(preg_replace('/\s+/', ' ', fgets($handler))); | ||
420 | + $elems = explode(' ',$oneLine); | ||
417 | // empty lines | 421 | // empty lines |
418 | if (count($elems) < 2) continue; | 422 | if (count($elems) < 2) continue; |
419 | $newtime = strtotime($elems[0]); | 423 | $newtime = strtotime($elems[0]); |
@@ -461,18 +465,18 @@ class FilesMgr extends AmdaObjectMgr | @@ -461,18 +465,18 @@ class FilesMgr extends AmdaObjectMgr | ||
461 | $newfile = fopen(USERDATADIR."temp", "w"); | 465 | $newfile = fopen(USERDATADIR."temp", "w"); |
462 | while (!feof($handle)) | 466 | while (!feof($handle)) |
463 | { | 467 | { |
464 | - if (($oneLine = fgets($handle)) !== false) | 468 | + $oneLine = trim(preg_replace('/\s+/', ' ', fgets($handle))); |
469 | + | ||
470 | + if ($oneLine !== false) | ||
465 | { | 471 | { |
466 | - $line = $timeLength == 'auto' ? $line = trim(preg_replace('/\s+/', ' ', $oneLine)) : trim($oneLine); | ||
467 | - | ||
468 | - if (strlen($line) > $formatLength) | 472 | + if (strlen($oneLine) > $formatLength) |
469 | { | 473 | { |
470 | try | 474 | try |
471 | { | 475 | { |
472 | - $date = DateTime::createFromFormat($timeFormat, trim(substr($line,0,$formatLength))); | 476 | + $date = DateTime::createFromFormat($timeFormat, trim(substr($oneLine,0,$formatLength))); |
473 | if (!$date) | 477 | if (!$date) |
474 | { | 478 | { |
475 | - if (strpos($line,'#') === 0) fwrite($newfile, $line.PHP_EOL); | 479 | + if (strpos($oneLine,'#') === 0) fwrite($newfile, $oneLine.PHP_EOL); |
476 | } | 480 | } |
477 | else | 481 | else |
478 | { | 482 | { |
@@ -480,7 +484,7 @@ class FilesMgr extends AmdaObjectMgr | @@ -480,7 +484,7 @@ class FilesMgr extends AmdaObjectMgr | ||
480 | if ($doy) { | 484 | if ($doy) { |
481 | $date->modify('-1 day'); | 485 | $date->modify('-1 day'); |
482 | } | 486 | } |
483 | - $suffix = preg_replace('/\s+/', ' ',substr($line, $formatLength)); | 487 | + $suffix = preg_replace('/\s+/', ' ',substr($oneLine, $formatLength)); |
484 | fwrite($newfile,$date->format('Y-m-d')."T".$date->format('H:i:s').$suffix.PHP_EOL); | 488 | fwrite($newfile,$date->format('Y-m-d')."T".$date->format('H:i:s').$suffix.PHP_EOL); |
485 | } | 489 | } |
486 | } | 490 | } |
@@ -490,7 +494,7 @@ class FilesMgr extends AmdaObjectMgr | @@ -490,7 +494,7 @@ class FilesMgr extends AmdaObjectMgr | ||
490 | } | 494 | } |
491 | } | 495 | } |
492 | else | 496 | else |
493 | - if (strpos($line,'#') === 0) fwrite($newfile,$line.PHP_EOL); | 497 | + if (strpos($oneLine,'#') === 0) fwrite($newfile,$oneLine.PHP_EOL); |
494 | } | 498 | } |
495 | } | 499 | } |
496 | } | 500 | } |
@@ -501,7 +505,7 @@ class FilesMgr extends AmdaObjectMgr | @@ -501,7 +505,7 @@ class FilesMgr extends AmdaObjectMgr | ||
501 | fclose($handle); | 505 | fclose($handle); |
502 | unlink($this->fileName); | 506 | unlink($this->fileName); |
503 | } | 507 | } |
504 | - return $false; | 508 | + return false; |
505 | } | 509 | } |
506 | 510 | ||
507 | fclose($newfile); | 511 | fclose($newfile); |
php/classes/TimeTableMgr.php
@@ -7,46 +7,38 @@ | @@ -7,46 +7,38 @@ | ||
7 | * | 7 | * |
8 | */ | 8 | */ |
9 | 9 | ||
10 | -function timeFormat($myString) | ||
11 | -{ | ||
12 | - if (format == "Y z H i s") { | ||
13 | - $tt = getdate(strtotime($myString)); | ||
14 | - return sprintf("%04d",$tt["year"])." " | ||
15 | - .sprintf("%03d",$tt["yday"]+1)." " | ||
16 | - .sprintf("%02d",$tt["hours"])." " | ||
17 | - .sprintf("%02d",$tt["minutes"])." " | ||
18 | - .sprintf("%02d",$tt["seconds"]); | ||
19 | - } | ||
20 | - return date(format,strtotime($myString)); | ||
21 | -} | ||
22 | - | ||
23 | class TimeTableMgr extends AmdaObjectMgr | 10 | class TimeTableMgr extends AmdaObjectMgr |
24 | -{ | ||
25 | - function __construct($user = NULL, $sharedObject = FALSE) | 11 | +{ |
12 | + /** | ||
13 | + * TimeTableMgr constructor. | ||
14 | + * @param null $user The user | ||
15 | + * @param bool $sharedObject Shared object | ||
16 | + */ | ||
17 | + public function __construct($user = null, $sharedObject = false) | ||
26 | { | 18 | { |
27 | parent::__construct('Tt.xml'); | 19 | parent::__construct('Tt.xml'); |
28 | $this->contentRootId = 'timeTable-treeRootNode'; | 20 | $this->contentRootId = 'timeTable-treeRootNode'; |
29 | $this->contentRootTag = 'timetabList'; | 21 | $this->contentRootTag = 'timetabList'; |
30 | - $this->attributes = array('name' => '', 'intervals' => ''); | ||
31 | - $this->optionalAttributes = array(); | 22 | + $this->attributes = ['name' => '', 'intervals' => '']; |
23 | + $this->optionalAttributes = []; | ||
32 | $this->objTagName = 'timetab'; | 24 | $this->objTagName = 'timetab'; |
33 | $this->id_prefix = 'tt_'; | 25 | $this->id_prefix = 'tt_'; |
34 | 26 | ||
35 | if (!$sharedObject && !file_exists($this->xmlName)) { | 27 | if (!$sharedObject && !file_exists($this->xmlName)) { |
36 | - $this->createDom(); | ||
37 | - $this->xp = new domxpath($this->contentDom); | 28 | + $this->createDom(); |
29 | + $this->xp = new domxpath($this->contentDom); | ||
38 | } | 30 | } |
39 | } | 31 | } |
40 | - | ||
41 | - protected function createDom() | 32 | + |
33 | + protected function createDom() | ||
42 | { | 34 | { |
43 | - $types = array('timetab' => 'timeTable', 'catalog' => 'catalog'); | 35 | + $types = ['timetab' => 'timeTable', 'catalog' => 'catalog']; |
44 | 36 | ||
45 | $rootElement = $this->contentDom->createElement('ws'); | 37 | $rootElement = $this->contentDom->createElement('ws'); |
46 | - | 38 | + |
47 | foreach ($types as $key => $value) { | 39 | foreach ($types as $key => $value) { |
48 | - $contentId = $value.'-treeRootNode'; | ||
49 | - $contentTag = $key.'List'; | 40 | + $contentId = $value . '-treeRootNode'; |
41 | + $contentTag = $key . 'List'; | ||
50 | $typeElement = $this->contentDom->createElement($contentTag); | 42 | $typeElement = $this->contentDom->createElement($contentTag); |
51 | $typeElement->setAttribute('xml:id', $contentId); | 43 | $typeElement->setAttribute('xml:id', $contentId); |
52 | $rootElement->appendChild($typeElement); | 44 | $rootElement->appendChild($typeElement); |
@@ -55,363 +47,600 @@ class TimeTableMgr extends AmdaObjectMgr | @@ -55,363 +47,600 @@ class TimeTableMgr extends AmdaObjectMgr | ||
55 | $this->contentDom->save($this->xmlName); | 47 | $this->contentDom->save($this->xmlName); |
56 | } | 48 | } |
57 | 49 | ||
58 | - /* | ||
59 | - * rename Time Table in id.xml | ||
60 | - */ | ||
61 | - protected function renameInResource($name, $id) | 50 | + /** |
51 | + * Get object | ||
52 | + * @param $id | ||
53 | + * @param $nodeType | ||
54 | + * @return array | ||
55 | + */ | ||
56 | + public function getObject($id, $nodeType = null) | ||
62 | { | 57 | { |
63 | - if (!file_exists(USERTTDIR.$id.'.xml')) return false; | 58 | + if (substr($nodeType, 0, 6) == 'shared') { |
59 | + //Shared object | ||
60 | + $sharedObjMgr = new SharedObjectsMgr(); | ||
61 | + $path = $sharedObjMgr->getDataFilePath(str_replace('shared', '', $nodeType), $id); | ||
62 | + } else { | ||
63 | + $path = USERTTDIR . $id . '.xml'; | ||
64 | + } | ||
64 | 65 | ||
65 | - $this->objectDom -> load(USERTTDIR.$id.'.xml'); | ||
66 | - if (!($objToRename = $this->objectDom->getElementById($id))) return false; | ||
67 | - $objToRename -> getElementsByTagName('name')->item(0)->nodeValue = $name; | ||
68 | - $this->objectDom ->save(USERTTDIR.$id.'.xml'); | ||
69 | - | ||
70 | - return true; | 66 | + if (!file_exists($path)) { |
67 | + return ['error' => NO_OBJECT_FILE]; | ||
68 | + } | ||
69 | + $this->objectDom->load($path); | ||
70 | + if (!($objToGet = $this->objectDom->getElementById($id))) { | ||
71 | + return ['error' => NO_SUCH_ID]; | ||
72 | + } | ||
73 | + $attributesToReturn['id'] = $objToGet->getAttribute('xml:id'); | ||
74 | + $attributes = $objToGet->childNodes; | ||
75 | + | ||
76 | + $nbInt = 0; | ||
77 | + foreach ($attributes as $attribute) { | ||
78 | + if ($attribute->nodeType == XML_ELEMENT_NODE) { | ||
79 | + /*if ($attribute->tagName == 'intervals') { | ||
80 | + $start = $attribute -> getElementsByTagName('start')->item(0) -> nodeValue; | ||
81 | + $stop = $attribute -> getElementsByTagName('stop')->item(0) -> nodeValue; | ||
82 | + $attributesToReturn['intervals'][] = array('start' => $start, 'stop' => $stop); | ||
83 | + } | ||
84 | + else | ||
85 | + $attributesToReturn[$attribute->tagName] = $attribute->nodeValue;*/ | ||
86 | + //BRE - load all except intervals - Intervals will be loaded later with 'loadIntervalsFromTT' function | ||
87 | + if ($attribute->tagName != 'intervals') { | ||
88 | + $attributesToReturn[$attribute->tagName] = $attribute->nodeValue; | ||
89 | + } else { | ||
90 | + $nbInt++; | ||
91 | + } | ||
92 | + } | ||
93 | + } | ||
94 | + $attributesToReturn['nbIntervals'] = $nbInt; | ||
95 | + | ||
96 | + return $attributesToReturn; | ||
71 | } | 97 | } |
72 | 98 | ||
73 | - protected function deleteParameter($id) | 99 | + /** |
100 | + * Modify an object | ||
101 | + * @param $p | ||
102 | + * @return array | ||
103 | + */ | ||
104 | + public function modifyObject($p) | ||
74 | { | 105 | { |
75 | - if (file_exists(USERTTDIR.$id.'.xml')) unlink(USERTTDIR.$id.'.xml'); | 106 | + $folder = $this->getObjectFolder($p->id); |
107 | + | ||
108 | + //Copy TT in a tempory file | ||
109 | + $ttFilePath = USERTTDIR . $p->id . '.xml'; | ||
110 | + $tmpFileExist = false; | ||
111 | + if (file_exists($ttFilePath)) { | ||
112 | + $tmpFileExist = copy($ttFilePath, $ttFilePath . ".tmp"); | ||
113 | + } | ||
114 | + | ||
115 | + //Delete TT | ||
116 | + $this->deleteObject($p); | ||
117 | + | ||
118 | + //Save modifications | ||
119 | + try { | ||
120 | + $result = $this->createObject($p, $folder); | ||
121 | + if ($result['error']) { | ||
122 | + throw new Exception($result['error']); | ||
123 | + } | ||
124 | + if ($tmpFileExist) { | ||
125 | + unlink($ttFilePath . ".tmp"); | ||
126 | + } | ||
127 | + return ['id' => $p->id, 'info' => $result['info']]; | ||
128 | + } catch (Exception $exception) { | ||
129 | + //Restore TT file | ||
130 | + if ($tmpFileExist) { | ||
131 | + copy($ttFilePath . ".tmp", $ttFilePath); | ||
132 | + unlink($ttFilePath . ".tmp"); | ||
133 | + } | ||
134 | + return ['error' => $exception->getMessage()]; | ||
135 | + } | ||
76 | } | 136 | } |
77 | 137 | ||
78 | - /* | ||
79 | - * Check if difference is name and info only | ||
80 | - */ | ||
81 | - protected function renameOnly($p) { | ||
82 | - //if (!($p->intervals)) return true; | ||
83 | - return false; | 138 | + /** |
139 | + * Create an object | ||
140 | + * @param $p | ||
141 | + * @param $folder | ||
142 | + * @return array | ||
143 | + */ | ||
144 | + public function createObject($p, $folder) | ||
145 | + { | ||
146 | + if ($p->leaf) { | ||
147 | + $result = $this->createParameter($p, $folder); | ||
148 | + if ($result['error']) { | ||
149 | + return $result; | ||
150 | + } | ||
151 | + $cacheMgr = new TimeTableCacheMgr(); | ||
152 | + if (isset($p->cacheToken) && ($p->cacheToken != '')) { | ||
153 | + $resultSaveInt = $cacheMgr->saveInTT($result['id'], "update", $p->cacheToken); | ||
154 | + if (!$resultSaveInt['success']) { | ||
155 | + if ($resultSaveInt['message']) { | ||
156 | + return ['error' => $resultSaveInt['message']]; | ||
157 | + } else { | ||
158 | + return ['error' => 'Unknown error during intervals save']; | ||
159 | + } | ||
160 | + } | ||
161 | + } | ||
162 | + return $result; | ||
163 | + } else { | ||
164 | + return ['error' => 'createFolder should be called from RENAME']; | ||
165 | + // return $this->createFolder($p); | ||
166 | + // TODO check if this is possible? | ||
167 | + } | ||
84 | } | 168 | } |
85 | - | ||
86 | - /* | ||
87 | - * In case of catalogs | ||
88 | - */ | ||
89 | - protected function setParamDescription($param) { } | ||
90 | 169 | ||
91 | - | ||
92 | - /* | ||
93 | - * Create Time Table | 170 | + /** |
171 | + * Create parameter (in case of catalogs) | ||
172 | + * @param $p | ||
173 | + * @param $folder | ||
174 | + * @return array | ||
94 | */ | 175 | */ |
95 | protected function createParameter($p, $folder) | 176 | protected function createParameter($p, $folder) |
96 | { | 177 | { |
97 | - if ($this -> objectExistsByName($p->name)) { | ||
98 | - $p -> id = $this -> getObjectIdByName($p->name); | ||
99 | - $this -> deleteObject($p); | 178 | + if ($this->objectExistsByName($p->name)) { |
179 | + $p->id = $this->getObjectIdByName($p->name); | ||
180 | + $this->deleteObject($p); | ||
100 | } | 181 | } |
101 | - | 182 | + |
102 | $this->id = $this->setId(); | 183 | $this->id = $this->setId(); |
103 | $this->created = date('Y-m-d\TH:i:s'); | 184 | $this->created = date('Y-m-d\TH:i:s'); |
104 | - if (!$this->id) return array('error' => ID_CREATION_ERROR); | ||
105 | - | ||
106 | - $this->resFileName = USERTTDIR.$this->id.'.xml'; | ||
107 | - //TODO catalog root element = 'timetable' | 185 | + if (!$this->id) { |
186 | + return ['error' => ID_CREATION_ERROR]; | ||
187 | + } | ||
188 | + | ||
189 | + $this->resFileName = USERTTDIR . $this->id . '.xml'; | ||
190 | + // TODO catalog root element = 'timetable' | ||
108 | $rootElement = $this->objectDom->createElement('timetable'); | 191 | $rootElement = $this->objectDom->createElement('timetable'); |
109 | - $rootElement->setAttribute('xml:id',$this->id); | ||
110 | - | ||
111 | - foreach ($p as $key => $value) | 192 | + $rootElement->setAttribute('xml:id', $this->id); |
193 | + | ||
194 | + foreach ($p as $key => $value) { | ||
112 | if ($key != 'id' && $key != 'leaf' && $key != 'nodeType' && | 195 | if ($key != 'id' && $key != 'leaf' && $key != 'nodeType' && |
113 | $key != 'objName' && $key != 'objFormat' && $key != 'folderId' && $key != 'cacheToken') { | 196 | $key != 'objName' && $key != 'objFormat' && $key != 'folderId' && $key != 'cacheToken') { |
114 | - if ($key == 'created') { | ||
115 | - $rootElement->appendChild($this->objectDom->createElement($key, $this->created)); | ||
116 | - } | ||
117 | - // it is catalog | ||
118 | - else if ($key == 'parameters') { | ||
119 | - $paramsElement = $this->setParamDescription($value); | ||
120 | - if ($paramsElement) $rootElement->appendChild($paramsElement); | ||
121 | - | 197 | + if ($key == 'created') { |
198 | + $rootElement->appendChild($this->objectDom->createElement($key, $this->created)); | ||
199 | + } // it is catalog | ||
200 | + else { | ||
201 | + if ($key == 'parameters') { | ||
202 | + $paramsElement = $this->setParamDescription($value); | ||
203 | + if ($paramsElement) { | ||
204 | + $rootElement->appendChild($paramsElement); | ||
205 | + } | ||
206 | + } else { | ||
207 | + if ($key != 'intervals') { | ||
208 | + $rootElement->appendChild($this->objectDom->createElement($key, htmlspecialchars($value))); | ||
209 | + } | ||
122 | } | 210 | } |
123 | - else if ($key != 'intervals') | ||
124 | - $rootElement->appendChild($this->objectDom->createElement($key, htmlspecialchars($value))); | 211 | + } |
125 | } | 212 | } |
213 | + } | ||
126 | 214 | ||
127 | $this->objectDom->appendChild($rootElement); | 215 | $this->objectDom->appendChild($rootElement); |
128 | $this->objectDom->save($this->resFileName); | 216 | $this->objectDom->save($this->resFileName); |
129 | $obj = new stdClass(); | 217 | $obj = new stdClass(); |
130 | $obj->name = $p->name; | 218 | $obj->name = $p->name; |
131 | $obj->intervals = $p->nbIntervals; | 219 | $obj->intervals = $p->nbIntervals; |
132 | - $this -> addToContent($obj, $folder); | ||
133 | - return array('id' => $this->id,'created' => $this->created,'info' =>$obj->intervals.' intervals' ); | 220 | + $this->addToContent($obj, $folder); |
221 | + // FIXME field created is undefined | ||
222 | + return ['id' => $this->id, 'created' => $this->created, 'info' => $obj->intervals . ' intervals']; | ||
134 | } | 223 | } |
135 | 224 | ||
136 | - protected function call_intersection($fst, $snd) | 225 | + /** |
226 | + * Set parameter description | ||
227 | + * TODO | ||
228 | + * @param $param string The parameter | ||
229 | + * @return DOMNode | ||
230 | + */ | ||
231 | + protected function setParamDescription($param) | ||
137 | { | 232 | { |
138 | - $inf = ( $fst[0] > $snd[0] ) ? $fst[0] : $snd[0]; | ||
139 | - $sup = ( $fst[1] < $snd[1] ) ? $fst[1] : $snd[1]; | ||
140 | - if ( $inf >= $sup ) { $inter[] = array(0,0); } | ||
141 | - else {$inter[] = array($inf,$sup); } | ||
142 | - return $inter; | 233 | + return new DOMNode(); |
143 | } | 234 | } |
144 | - | 235 | + |
236 | + /** | ||
237 | + * Get uploaded object | ||
238 | + * @param $name | ||
239 | + * @param $format | ||
240 | + * @param bool $onlyDescription | ||
241 | + * @return mixed | ||
242 | + */ | ||
243 | + public function getUploadedObject($name, $format, $onlyDescription = false) | ||
244 | + { | ||
245 | + if (strpos($name, '.txt') !== false || strpos($name, '.asc') !== false || strpos($name, '.') == false) { | ||
246 | + $attributesToReturn = $this->textToAmda(USERTEMPDIR . $name, $onlyDescription); | ||
247 | + $attributesToReturn['objName'] = $name; | ||
248 | + $attributesToReturn['objFormat'] = $format; | ||
249 | + | ||
250 | + return $attributesToReturn; | ||
251 | + } | ||
252 | + | ||
253 | + if ($format == 'VOT') { | ||
254 | + $attributesToReturn = $this->vot2amda(USERTEMPDIR . $name, $onlyDescription); | ||
255 | + $attributesToReturn['objName'] = $name; | ||
256 | + $attributesToReturn['objFormat'] = $format; | ||
257 | + | ||
258 | + return $attributesToReturn; | ||
259 | + } | ||
260 | + | ||
261 | + if (strpos($name, '.xml') !== false) { | ||
262 | + $temp = explode('.xml', $name); | ||
263 | + $name = $temp[0]; | ||
264 | + } | ||
265 | + | ||
266 | + if (!file_exists(USERTEMPDIR . $name . '.xml')) { | ||
267 | + return ['error' => 'no such name']; | ||
268 | + } | ||
269 | + | ||
270 | + $this->objectDom->load(USERTEMPDIR . $name . '.xml'); | ||
271 | + if (!($objToGet = $this->objectDom->getElementsByTagName('timetable')->item(0)) && | ||
272 | + !($objToGet = $this->objectDom->getElementsByTagName('TimeTable')->item(0))) { | ||
273 | + return ['error' => 'no time table']; | ||
274 | + } | ||
275 | + | ||
276 | + $attributes = $objToGet->childNodes; | ||
277 | + $attributesToReturn['name'] = $name; | ||
278 | + $attributesToReturn['objName'] = $name; | ||
279 | + $attributesToReturn['objFormat'] = $format; | ||
280 | + | ||
281 | + /** @var DOMElement $attribute */ | ||
282 | + foreach ($attributes as $attribute) { | ||
283 | + if ($attribute->nodeType == XML_ELEMENT_NODE) { | ||
284 | + if ($attribute->tagName == 'intervals') { | ||
285 | + $start = $attribute->getElementsByTagName('start')->item(0)->nodeValue; | ||
286 | + $stop = $attribute->getElementsByTagName('stop')->item(0)->nodeValue; | ||
287 | + if (!$onlyDescription) { | ||
288 | + $attributesToReturn['intervals'][] = ['start' => $start, 'stop' => $stop]; | ||
289 | + } | ||
290 | + } else { | ||
291 | + if ($attribute->tagName == 'Interval') { | ||
292 | + $start = $attribute->getElementsByTagName('Start')->item(0)->nodeValue; | ||
293 | + $stop = $attribute->getElementsByTagName('Stop')->item(0)->nodeValue; | ||
294 | + if (!$onlyDescription) { | ||
295 | + $attributesToReturn['intervals'][] = ['start' => $start, 'stop' => $stop]; | ||
296 | + } | ||
297 | + } else { | ||
298 | + switch (strtolower($attribute->tagName)) { | ||
299 | + case 'created': | ||
300 | + $attributesToReturn['created'] = $attribute->nodeValue; | ||
301 | + break; | ||
302 | + case 'chain': | ||
303 | + case 'source': | ||
304 | + $attributesToReturn['description'] = $attribute->nodeValue; | ||
305 | + break; | ||
306 | + default: | ||
307 | + break; | ||
308 | + } | ||
309 | + } | ||
310 | + } | ||
311 | + } | ||
312 | + } | ||
313 | + return $attributesToReturn; | ||
314 | + } | ||
315 | + | ||
145 | /* | 316 | /* |
146 | * Uploaded text file => convert to array | 317 | * Uploaded text file => convert to array |
147 | */ | 318 | */ |
148 | - protected function text2amda($tmp_file, $onlyDescription = false) | ||
149 | - { | 319 | + |
320 | + /** | ||
321 | + * Convert text to AMDA attributes | ||
322 | + * @param $tmp_file | ||
323 | + * @param bool $onlyDescription | ||
324 | + * @return mixed | ||
325 | + */ | ||
326 | + protected function textToAmda($tmp_file, $onlyDescription = false) | ||
327 | + { | ||
150 | $suffix = explode('.', basename($tmp_file)); | 328 | $suffix = explode('.', basename($tmp_file)); |
151 | - $lines = file($tmp_file,FILE_SKIP_EMPTY_LINES); | ||
152 | - $description="Uploaded Time Table".PHP_EOL; | 329 | + $lines = file($tmp_file, FILE_SKIP_EMPTY_LINES); |
330 | + $description = "Uploaded Time Table" . PHP_EOL; | ||
153 | 331 | ||
154 | $recordsNumber = count($lines); | 332 | $recordsNumber = count($lines); |
155 | $descNumber = 0; | 333 | $descNumber = 0; |
156 | - | ||
157 | - foreach ($lines as $line) | ||
158 | - { | ||
159 | - if ($line[0] == '#') { | ||
160 | - $description=$description.PHP_EOL.substr($line,1,-1); | ||
161 | - } | ||
162 | - else { | ||
163 | - $date = explode(' ', trim(preg_replace('!\s+!', ' ',$line))); | ||
164 | - | ||
165 | - if (!strtotime(trim($date[0]))) { | ||
166 | - $description=$description.PHP_EOL.$line; | ||
167 | - $descNumber++; | ||
168 | - continue; | ||
169 | - } | ||
170 | - // check if it is ISO format | ||
171 | - if (!isset($isIso)) | ||
172 | - $isIso = preg_match('/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})$/', trim($date[0])); | ||
173 | - | ||
174 | - if (!$isIso) { | ||
175 | - // y-m-d h:m:s for example | ||
176 | - $dateLength = count($date) / 2; | ||
177 | - | ||
178 | - $tempStart = $date[0]; | ||
179 | - $tempStop = $date[$dateLength]; | ||
180 | - | ||
181 | - if ($dateLength > 1) { | ||
182 | - for ($i = 1; $i < $dateLength; $i++) | ||
183 | - $tempStart.= $date[$i]; | ||
184 | - | ||
185 | - for ($i = $dateLength + 1; $i < $dateLength * 2; $i++) | ||
186 | - $tempStop .= $date[$i]; | 334 | + |
335 | + foreach ($lines as $line) { | ||
336 | + $line = preg_replace('/[-:\/\s]+/', ' ', trim($line)); | ||
337 | + if ($line[0] == '#') { // Comment | ||
338 | + $description = $description . PHP_EOL . substr($line, 1, -1); | ||
339 | + } else { | ||
340 | + $isoFormat = 'Y-m-dTH:i:s'; | ||
341 | + $doyFormat = 'Y z H i s'; | ||
342 | + $doyRegex = '(\d{4}) (\d{3}) (\d{2}) (\d{2}) (\d{2})( \d{2})?'; | ||
343 | + | ||
344 | + if (preg_match('/^' . $doyRegex . ' ' . $doyRegex . '$/', $line)) { | ||
345 | + $start = DateTime::createFromFormat($doyFormat, substr($line, 0, 17)); | ||
346 | + $stop = DateTime::createFromFormat($doyFormat, substr($line, 18)); | ||
347 | + $startDate = $start->sub(new DateInterval('P1D'))->format($isoFormat); | ||
348 | + $stopDate = $stop->sub(new DateInterval('P1D'))->format($isoFormat); | ||
349 | + } else { | ||
350 | + $dateLength = round((strlen($line)-1) / 2); | ||
351 | + | ||
352 | + $start = explode(' ', substr($line, 0, $dateLength) . ' 00'); | ||
353 | + $startTime = strtotime("$start[0]/$start[1]/$start[2] $start[3]:$start[4]:$start[5]"); | ||
354 | + | ||
355 | + $stop = explode(' ', substr($line, $dateLength + 1) . ' 00'); | ||
356 | + $stopTime = strtotime("$stop[0]/$stop[1]/$stop[2] $stop[3]:$stop[4]:$stop[5]"); | ||
357 | + if (is_numeric($startTime) && is_numeric($stopTime)) { | ||
358 | + $startDate = date($isoFormat, $startTime); | ||
359 | + $stopDate = date($isoFormat, $stopTime); | ||
360 | + } else { | ||
361 | + $description = $description . PHP_EOL . $line; | ||
362 | + $descNumber++; | ||
363 | + continue; | ||
187 | } | 364 | } |
365 | + } | ||
188 | 366 | ||
189 | - $startDate = date('Y-m-d\TH:i:s',strtotime($tempStart)); | ||
190 | - $stopDate = date('Y-m-d\TH:i:s',strtotime($tempStop)); | ||
191 | - | ||
192 | - if (!$onlyDescription) | ||
193 | - $attributesToReturn['intervals'][] = array('start' => $startDate, 'stop' => $stopDate); | 367 | + if (!$onlyDescription) { |
368 | + $attributesToReturn['intervals'][] = ['start' => $startDate, 'stop' => $stopDate]; | ||
194 | } | 369 | } |
195 | - else { | ||
196 | - if (!$onlyDescription) | ||
197 | - $attributesToReturn['intervals'][] = array('start' => trim($date[0]), 'stop' => trim($date[1])); | ||
198 | - } | ||
199 | } | 370 | } |
200 | } | 371 | } |
201 | - if ( $recordsNumber == $descNumber ) | ||
202 | - $description = "Looks like we can not read your time format...".PHP_EOL.$description; | ||
203 | - | 372 | + if ($recordsNumber == $descNumber) { |
373 | + $description = 'Looks like we can not read your time format...' . PHP_EOL . $description; | ||
374 | + } | ||
375 | + | ||
204 | $attributesToReturn['description'] = $description; | 376 | $attributesToReturn['description'] = $description; |
205 | - $attributesToReturn['name'] = basename($tmp_file, '.'.$suffix[1]); | 377 | + $attributesToReturn['name'] = basename($tmp_file, '.' . $suffix[1]); |
206 | $attributesToReturn['created'] = date('Y-m-d\TH:i:s'); | 378 | $attributesToReturn['created'] = date('Y-m-d\TH:i:s'); |
207 | - | ||
208 | return $attributesToReturn; | 379 | return $attributesToReturn; |
209 | } | 380 | } |
210 | 381 | ||
211 | - /* | ||
212 | - * Uploaded vot TT => convert to array | ||
213 | - */ | ||
214 | - protected function vot2amda($tmp_file, $onlyDescription = false) { | ||
215 | - // Load Time table | ||
216 | - $this->objectDom -> load($tmp_file); | 382 | + /** |
383 | + * Convert VOTable time table to AMDA attributes | ||
384 | + * @param $tmp_file | ||
385 | + * @param bool $onlyDescription | ||
386 | + * @return mixed | ||
387 | + */ | ||
388 | + protected function vot2amda($tmp_file, $onlyDescription = false) | ||
389 | + { | ||
390 | + // Load Time table | ||
391 | + $this->objectDom->load($tmp_file); | ||
217 | $objToGet = $this->objectDom->getElementsByTagName('TABLEDATA')->item(0); | 392 | $objToGet = $this->objectDom->getElementsByTagName('TABLEDATA')->item(0); |
218 | $attributesToReturn['name'] = $tmp_file; | 393 | $attributesToReturn['name'] = $tmp_file; |
219 | - $attributes = $objToGet -> childNodes; | ||
220 | - foreach($attributes as $attribute) | 394 | + $attributes = $objToGet->childNodes; |
395 | + | ||
396 | + /** @var DOMElement $attribute */ | ||
397 | + foreach ($attributes as $attribute) { | ||
221 | if ($attribute->tagName == 'TR') { | 398 | if ($attribute->tagName == 'TR') { |
222 | - $start = $attribute -> getElementsByTagName('TD')->item(0) -> nodeValue; | ||
223 | - $stop = $attribute -> getElementsByTagName('TD')->item(1) -> nodeValue; | ||
224 | - if (!$onlyDescription) | ||
225 | - $attributesToReturn['intervals'][] = array('start' => $start, 'stop' => $stop); | 399 | + $start = $attribute->getElementsByTagName('TD')->item(0)->nodeValue; |
400 | + $stop = $attribute->getElementsByTagName('TD')->item(1)->nodeValue; | ||
401 | + if (!$onlyDescription) { | ||
402 | + $attributesToReturn['intervals'][] = ['start' => $start, 'stop' => $stop]; | ||
403 | + } | ||
226 | } | 404 | } |
227 | - $suffix = explode('.', basename($tmp_file)); | ||
228 | - $attributesToReturn['name'] = basename($tmp_file, '.'.$suffix[1]); | ||
229 | - $attributesToReturn['created'] = date('Y-m-d')."T".date('H:i:s'); | ||
230 | - $attributesToReturn['description'] = htmlspecialchars($this->objectDom->getElementsByTagName('DESCRIPTION')->item(0) -> nodeValue); | ||
231 | - return($attributesToReturn); | 405 | + } |
406 | + $suffix = explode('.', basename($tmp_file)); | ||
407 | + $attributesToReturn['name'] = basename($tmp_file, '.' . $suffix[1]); | ||
408 | + $attributesToReturn['created'] = date('Y-m-d') . "T" . date('H:i:s'); | ||
409 | + $description = $this->objectDom->getElementsByTagName('DESCRIPTION')->item(0)->nodeValue; | ||
410 | + $attributesToReturn['description'] = htmlspecialchars($description); | ||
411 | + return ($attributesToReturn); | ||
232 | } | 412 | } |
233 | - | 413 | + |
234 | /***************************************************************** | 414 | /***************************************************************** |
235 | * PUBLIC FUNCTIONS | 415 | * PUBLIC FUNCTIONS |
236 | *****************************************************************/ | 416 | *****************************************************************/ |
237 | - | 417 | + |
238 | /* | 418 | /* |
239 | * Get Object into Edit | 419 | * Get Object into Edit |
240 | */ | 420 | */ |
241 | - function getObject($id, $nodeType) { | ||
242 | - if (substr($nodeType,0,6) == 'shared') { | ||
243 | - //Shared object | ||
244 | - $sharedObjMgr = new SharedObjectsMgr(); | ||
245 | - $path = $sharedObjMgr->getDataFilePath(str_replace('shared', '', $nodeType), $id); | 421 | + public function getTmpObject($folderId, $name, $onlyDescription = false) |
422 | + { | ||
423 | + $filePath = USERWORKINGDIR . $folderId . '/' . $name . '.xml'; | ||
424 | + if (!file_exists($filePath)) { | ||
425 | + return ['error' => 'Cannot find result file']; | ||
246 | } | 426 | } |
247 | - else { | ||
248 | - $path = USERTTDIR.$id.'.xml'; | 427 | + |
428 | + $dom = new DomDocument('1.0'); | ||
429 | + $dom->formatOutput = true; | ||
430 | + | ||
431 | + if (!$dom->load($filePath)) { | ||
432 | + return ['error' => 'Cannot load result file']; | ||
249 | } | 433 | } |
250 | 434 | ||
251 | - if (!file_exists($path)) return array('error' => NO_OBJECT_FILE); | ||
252 | - $this->objectDom -> load($path); | ||
253 | - if (!($objToGet = $this->objectDom->getElementById($id))) return array('error' => NO_SUCH_ID); | ||
254 | - $attributesToReturn['id'] = $objToGet->getAttribute('xml:id'); | ||
255 | - $attributes = $objToGet -> childNodes; | 435 | + $descNodes = $dom->getElementsByTagName('description'); |
436 | + if ($descNodes->length > 0) { | ||
437 | + $attributesToReturn['description'] = $descNodes->item(0)->nodeValue; | ||
438 | + } | ||
256 | 439 | ||
257 | - $nbInt = 0; | ||
258 | - foreach($attributes as $attribute) | ||
259 | - if($attribute->nodeType == XML_ELEMENT_NODE){ | ||
260 | - /*if ($attribute->tagName == 'intervals') { | ||
261 | - $start = $attribute -> getElementsByTagName('start')->item(0) -> nodeValue; | ||
262 | - $stop = $attribute -> getElementsByTagName('stop')->item(0) -> nodeValue; | ||
263 | - $attributesToReturn['intervals'][] = array('start' => $start, 'stop' => $stop); | ||
264 | - } | ||
265 | - else | ||
266 | - $attributesToReturn[$attribute->tagName] = $attribute->nodeValue;*/ | ||
267 | - //BRE - load all except intervals - Intervals will be loaded later with 'loadIntervalsFromTT' function | ||
268 | - if ($attribute->tagName != 'intervals') | ||
269 | - $attributesToReturn[$attribute->tagName] = $attribute->nodeValue; | ||
270 | - else | ||
271 | - $nbInt++; | ||
272 | - } | ||
273 | - | ||
274 | - $attributesToReturn['nbIntervals'] = $nbInt; | ||
275 | - | ||
276 | - return $attributesToReturn; | ||
277 | - } | ||
278 | - | ||
279 | - public function createObject($p, $folder) | ||
280 | - { | ||
281 | - if ($p -> leaf){ | ||
282 | - $result = $this->createParameter($p, $folder); | ||
283 | - if ($result['error']) | ||
284 | - return $result; | ||
285 | - $cacheMgr = new TimeTableCacheMgr(); | ||
286 | - if (isset($p->cacheToken) && ($p->cacheToken != '')) | ||
287 | - { | ||
288 | - $resultSaveInt = $cacheMgr->saveInTT($result['id'], "update", $p->cacheToken); | ||
289 | - if (!$resultSaveInt['success']) | ||
290 | - { | ||
291 | - if ($resultSaveInt['message']) | ||
292 | - return array('error' => $resultSaveInt['message']); | ||
293 | - else | ||
294 | - return array('error' => 'Unknown error during intervals save'); | 440 | + $creatNodes = $dom->getElementsByTagName('created'); |
441 | + if ($creatNodes->length > 0) { | ||
442 | + $attributesToReturn['created'] = $creatNodes->item(0)->nodeValue; | ||
443 | + } | ||
444 | + | ||
445 | + $histNodes = $dom->getElementsByTagName('history'); | ||
446 | + if ($histNodes->length > 0) { | ||
447 | + $attributesToReturn['history'] = $histNodes->item(0)->nodeValue; | ||
448 | + } | ||
449 | + | ||
450 | + $attributesToReturn['objName'] = $name; | ||
451 | + $attributesToReturn['folderId'] = $folderId; | ||
452 | + | ||
453 | + if (!$onlyDescription) { | ||
454 | + $intNodes = $dom->getElementsByTagName('intervals'); | ||
455 | + | ||
456 | + /** @var DOMElement $intNode */ | ||
457 | + foreach ($intNodes as $intNode) { | ||
458 | + $startNodes = $intNode->getElementsByTagName('start'); | ||
459 | + if ($startNodes->length <= 0) { | ||
460 | + return ['error' => 'Error detected in result file']; | ||
461 | + } | ||
462 | + $stopNodes = $intNode->getElementsByTagName('stop'); | ||
463 | + if ($stopNodes->length <= 0) { | ||
464 | + return ['error' => 'Error detected in result file']; | ||
295 | } | 465 | } |
466 | + $attributesToReturn['intervals'][] = [ | ||
467 | + 'start' => $startNodes->item(0)->nodeValue, | ||
468 | + 'stop' => $stopNodes->item(0)->nodeValue | ||
469 | + ]; | ||
296 | } | 470 | } |
297 | - return $result; | ||
298 | } | 471 | } |
299 | - // else return $this->createFolder($p); | ||
300 | - //TODO check if this is possible? | ||
301 | - else return array('error' => 'createFolder should be called from RENAME'); | 472 | + |
473 | + return $attributesToReturn; | ||
302 | } | 474 | } |
303 | - | ||
304 | - | ||
305 | - public function modifyObject($p) { | ||
306 | - $folder = $this->getObjectFolder($p->id); | ||
307 | - | ||
308 | - //Copy TT in a tempory file | ||
309 | - $ttFilePath = USERTTDIR.$p->id.'.xml'; | ||
310 | - $tmpFileExist = FALSE; | ||
311 | - if (file_exists($ttFilePath)) | ||
312 | - $tmpFileExist = copy($ttFilePath,$ttFilePath.".tmp"); | ||
313 | - | ||
314 | - //Delete TT | ||
315 | - $this->deleteObject($p); | ||
316 | - | ||
317 | - //Save modifications | ||
318 | - try { | ||
319 | - $result = $this->createObject($p, $folder); | ||
320 | - if ($result['error']) | ||
321 | - throw new Exception($result['error']); | ||
322 | - if ($tmpFileExist) | ||
323 | - unlink($ttFilePath.".tmp"); | ||
324 | - return array('id' => $p->id, 'info' => $result['info']); | 475 | + |
476 | + /** | ||
477 | + * Merge time tables | ||
478 | + * @param $obj | ||
479 | + * @return array | ||
480 | + */ | ||
481 | + public function merge($obj) | ||
482 | + { | ||
483 | + /** | ||
484 | + * Array of intervals, used like : | ||
485 | + * [{start:'2010-01-01T23:00:00',stop:'2011-01-01T20:00:00'},{start:'2009-01-01T23:00:00',stop:'2010-01-01T20:00:00'}] | ||
486 | + * $attributesToReturn['intervals'][] = array('start' => $start, 'stop' => $stop); | ||
487 | + */ | ||
488 | + | ||
489 | + $intervals = 0; | ||
490 | + for ($iId = 0; $iId < count($obj->ids); $iId++) { | ||
491 | + $table[$iId] = $this->loadIntervalsFromTT($obj->ids[$iId]); | ||
492 | + for ($jId = 0; $jId < count($table[$iId]['intervals']); $jId++) { | ||
493 | + $interval[$iId][$jId][0] = $table[$iId]['intervals'][$jId]['start']; | ||
494 | + $interval[$iId][$jId][1] = $table[$iId]['intervals'][$jId]['stop']; | ||
495 | + } | ||
496 | + $intervals += count($interval[$iId]); | ||
325 | } | 497 | } |
326 | - catch (Exception $e) { | ||
327 | - //Restore TT file | ||
328 | - if ($tmpFileExist) | ||
329 | - { | ||
330 | - copy($ttFilePath.".tmp", $ttFilePath); | ||
331 | - unlink($ttFilePath.".tmp"); | 498 | + if ($intervals > 10000) { |
499 | + set_time_limit(1800); | ||
500 | + } | ||
501 | + | ||
502 | + $final = []; | ||
503 | + for ($iId = 0; $iId < count($obj->ids); $iId++) { | ||
504 | + $final = array_merge($final, $interval[$iId]); | ||
505 | + } | ||
506 | + sort($final); | ||
507 | + | ||
508 | + // Algorithm of union | ||
509 | + $line = 0; | ||
510 | + $iId = 0; | ||
511 | + $val = $final[$iId][0]; | ||
512 | + while ($iId < count($final) - 1) { | ||
513 | + if ($final[$iId + 1][1] <= $final[$iId][1]) { | ||
514 | + array_splice($final, $iId + 1, 1); | ||
515 | + } else { | ||
516 | + if (($final[$iId + 1][0] <= $final[$iId][1]) && ($final[$iId + 1][1] >= $final[$iId][1])) { | ||
517 | + $iId++; | ||
518 | + } else { | ||
519 | + $start[$line] = $val; | ||
520 | + $stop[$line] = $final[$iId][1]; | ||
521 | + $iId++; | ||
522 | + $line++; | ||
523 | + $val = $final[$iId][0]; | ||
524 | + } | ||
332 | } | 525 | } |
333 | - return array ('error' => $e->getMessage()); | ||
334 | } | 526 | } |
527 | + $start[$line] = $val; | ||
528 | + $stop[$line] = $final[$iId][1]; | ||
529 | + | ||
530 | + $objTT = new stdClass(); | ||
531 | + $objTT->name = $obj->name; | ||
532 | + $objTT->nodeType = 'timeTable'; | ||
533 | + $objTT->leaf = true; | ||
534 | + $objTT->created = null; | ||
535 | + $objTT->history = $obj->history; | ||
536 | + for ($iId = 0; $iId < count($start); $iId++) { | ||
537 | + $inter = new stdClass(); | ||
538 | + $inter->start = $start[$iId]; | ||
539 | + $inter->stop = $stop[$iId]; | ||
540 | + $objTT->intervals[] = $inter; | ||
541 | + } | ||
542 | + $objTT->nbIntervals = count($start); | ||
543 | + $this->objectDom = new DomDocument('1.0'); | ||
544 | + $this->objectDom->formatOutput = true; | ||
545 | + | ||
546 | + $res = $this->createParameter($objTT, $folder); // FIXME $folder is undefined | ||
547 | + if ($res['error']) { | ||
548 | + return $res; | ||
549 | + } | ||
550 | + | ||
551 | + $this->saveIntervals($res['id'], $objTT->intervals, 'merge'); | ||
552 | + return $res; | ||
335 | } | 553 | } |
336 | - | ||
337 | - public function loadIntervalsFromTT($id,$typeTT,$start = NULL, $limit = NULL) | 554 | + |
555 | + /** | ||
556 | + * Load intervals from time table | ||
557 | + * @param $id | ||
558 | + * @param $typeTT | ||
559 | + * @param null $start | ||
560 | + * @param null $limit | ||
561 | + * @return array | ||
562 | + */ | ||
563 | + public function loadIntervalsFromTT($id, $typeTT = '', $start = null, $limit = null) | ||
338 | { | 564 | { |
339 | if ($typeTT == 'sharedtimeTable') { | 565 | if ($typeTT == 'sharedtimeTable') { |
340 | //Shared object | 566 | //Shared object |
341 | $sharedObjMgr = new SharedObjectsMgr(); | 567 | $sharedObjMgr = new SharedObjectsMgr(); |
342 | $path = $sharedObjMgr->getDataFilePath('timeTable', $id); | 568 | $path = $sharedObjMgr->getDataFilePath('timeTable', $id); |
569 | + } else { | ||
570 | + $path = USERTTDIR . $id . '.xml'; | ||
571 | + } | ||
572 | + | ||
573 | + //load intervals from TT id | ||
574 | + if (!file_exists($path)) { | ||
575 | + return ['success' => false, 'message' => "Cannot find TT file " . $id]; | ||
343 | } | 576 | } |
344 | - else { | ||
345 | - $path = USERTTDIR.$id.'.xml'; | ||
346 | - } | ||
347 | - | ||
348 | - //load intervals from TT id | ||
349 | - if (!file_exists($path)) | ||
350 | - return array('success' => false, 'message' => "Cannot find TT file ".$id); | ||
351 | - | ||
352 | - $this->objectDom -> load($path); | ||
353 | - if (!($objToGet = $this->objectDom->getElementById($id))) | ||
354 | - return array('success' => false, 'message' => NO_SUCH_ID." ".$id); | ||
355 | - | 577 | + |
578 | + $this->objectDom->load($path); | ||
579 | + if (!($objToGet = $this->objectDom->getElementById($id))) { | ||
580 | + return ['success' => false, 'message' => NO_SUCH_ID . " " . $id]; | ||
581 | + } | ||
582 | + | ||
356 | $xpath = new DOMXPath($this->objectDom); | 583 | $xpath = new DOMXPath($this->objectDom); |
357 | - $intervals = $xpath->query('//intervals'); | ||
358 | - | ||
359 | - $result = array(); | ||
360 | - | 584 | + $intervals = $xpath->query('//intervals'); |
585 | + | ||
586 | + $result = []; | ||
587 | + | ||
361 | if (!isset($start) || !isset($limit)) { | 588 | if (!isset($start) || !isset($limit)) { |
589 | + | ||
590 | + /** @var DOMElement $interval */ | ||
362 | foreach ($intervals as $interval) { | 591 | foreach ($intervals as $interval) { |
363 | $startTime = $interval->getElementsByTagName('start')->item(0)->nodeValue; | 592 | $startTime = $interval->getElementsByTagName('start')->item(0)->nodeValue; |
364 | - $stopTime = $interval->getElementsByTagName('stop')->item(0)->nodeValue; | ||
365 | - array_push($result, array('start' => $startTime, 'stop' => $stopTime)); | 593 | + $stopTime = $interval->getElementsByTagName('stop')->item(0)->nodeValue; |
594 | + array_push($result, ['start' => $startTime, 'stop' => $stopTime]); | ||
366 | } | 595 | } |
367 | - } | ||
368 | - else { | ||
369 | - for ($i = 0; $i < $limit; ++$i) { | ||
370 | - if ($start+$i >= $intervals->length) | 596 | + } else { |
597 | + for ($iInt = 0; $iInt < $limit; ++$iInt) { | ||
598 | + if ($start + $iInt >= $intervals->length) { | ||
371 | break; | 599 | break; |
372 | - $startTime = $intervals->item($start+$i)->getElementsByTagName('start')->item(0)->nodeValue; | ||
373 | - $stopTime = $intervals->item($start+$i)->getElementsByTagName('stop')->item(0)->nodeValue; | ||
374 | - array_push($result, array('start' => $startTime, 'stop' => $stopTime)); | 600 | + } |
601 | + $startTime = $intervals->item($start + $iInt)->getElementsByTagName('start')->item(0)->nodeValue; | ||
602 | + $stopTime = $intervals->item($start + $iInt)->getElementsByTagName('stop')->item(0)->nodeValue; | ||
603 | + array_push($result, ['start' => $startTime, 'stop' => $stopTime]); | ||
375 | } | 604 | } |
376 | } | 605 | } |
377 | - | ||
378 | - return array( | ||
379 | - 'totalCount' => $intervals->length, | ||
380 | - 'intervals' => $result, | ||
381 | - 'start' => isset($start) ? $start : 0, | ||
382 | - 'limit' => isset($limit) ? $limit : 0, | ||
383 | - 'success' => true | ||
384 | - ); | ||
385 | - } | ||
386 | - | ||
387 | - protected function createIntervalElement($interval) | ||
388 | - { | ||
389 | - $newInterval = $this->objectDom->createElement('intervals'); | ||
390 | - $newInterval->appendChild($this->objectDom->createElement('start',$interval->start)); | ||
391 | - $newInterval->appendChild($this->objectDom->createElement('stop',$interval->stop)); | ||
392 | - return $newInterval; | 606 | + |
607 | + return [ | ||
608 | + 'totalCount' => $intervals->length, | ||
609 | + 'intervals' => $result, | ||
610 | + 'start' => isset($start) ? $start : 0, | ||
611 | + 'limit' => isset($limit) ? $limit : 0, | ||
612 | + 'success' => true | ||
613 | + ]; | ||
393 | } | 614 | } |
394 | - | ||
395 | - public function saveIntervals($id,$intervals,$action) | 615 | + |
616 | + /** | ||
617 | + * Save intervals | ||
618 | + * @param $id | ||
619 | + * @param $intervals | ||
620 | + * @param $action | ||
621 | + * @return array | ||
622 | + */ | ||
623 | + public function saveIntervals($id, $intervals, $action) | ||
396 | { | 624 | { |
397 | - if (substr($id,0,6) == 'shared') { | ||
398 | - return array('success' => false, 'message' => "Cannot save shared TimeTable"); | ||
399 | - } | ||
400 | - else { | ||
401 | - $path = USERTTDIR.$id.'.xml'; | ||
402 | - } | ||
403 | - if (!file_exists($path)) | ||
404 | - return array('success' => false, 'message' => "Cannot find TT file ".$id); | ||
405 | - $this->objectDom -> load($path); | ||
406 | - | ||
407 | - if (!($objToGet = $this->objectDom->getElementById($id))) | ||
408 | - return array('success' => false, 'message' => NO_SUCH_ID." ".$id); | 625 | + if (substr($id, 0, 6) == 'shared') { |
626 | + return ['success' => false, 'message' => "Cannot save shared TimeTable"]; | ||
627 | + } else { | ||
628 | + $path = USERTTDIR . $id . '.xml'; | ||
629 | + } | ||
630 | + if (!file_exists($path)) { | ||
631 | + return ['success' => false, 'message' => "Cannot find TT file " . $id]; | ||
632 | + } | ||
633 | + $this->objectDom->load($path); | ||
634 | + | ||
635 | + if (!($objToGet = $this->objectDom->getElementById($id))) { | ||
636 | + return ['success' => false, 'message' => NO_SUCH_ID . " " . $id]; | ||
637 | + } | ||
409 | 638 | ||
410 | //remove old intervals | 639 | //remove old intervals |
411 | $crtNode = $objToGet->firstChild; | 640 | $crtNode = $objToGet->firstChild; |
412 | - | 641 | + |
413 | while ($crtNode) { | 642 | while ($crtNode) { |
414 | - if (($crtNode->nodeType != XML_ELEMENT_NODE) || ($crtNode->tagName != 'intervals')) { | 643 | + if (($crtNode->nodeType != XML_ELEMENT_NODE) || ($crtNode->tagName != 'intervals')) { |
415 | $crtNode = $crtNode->nextSibling; | 644 | $crtNode = $crtNode->nextSibling; |
416 | continue; | 645 | continue; |
417 | } | 646 | } |
@@ -420,357 +649,261 @@ class TimeTableMgr extends AmdaObjectMgr | @@ -420,357 +649,261 @@ class TimeTableMgr extends AmdaObjectMgr | ||
420 | $objToGet->removeChild($toRemove); | 649 | $objToGet->removeChild($toRemove); |
421 | unset($toRemove); | 650 | unset($toRemove); |
422 | } | 651 | } |
423 | - | 652 | + |
424 | //add new intervals | 653 | //add new intervals |
425 | - foreach ($intervals as $interval) { | ||
426 | - $newInterval = $this-> createIntervalElement($interval); | 654 | + foreach ($intervals as $interval) { |
655 | + $newInterval = $this->createIntervalElement($interval); | ||
427 | $this->objectDom->documentElement->appendChild($newInterval); | 656 | $this->objectDom->documentElement->appendChild($newInterval); |
428 | } | 657 | } |
429 | 658 | ||
430 | //save modifications | 659 | //save modifications |
431 | $this->id = $id; | 660 | $this->id = $id; |
432 | - $this->resFileName = USERTTDIR.$this->id.'.xml'; | 661 | + $this->resFileName = USERTTDIR . $this->id . '.xml'; |
433 | $this->objectDom->save($this->resFileName); | 662 | $this->objectDom->save($this->resFileName); |
434 | - | 663 | + |
435 | unset($this->objectDom); | 664 | unset($this->objectDom); |
436 | - | ||
437 | - return array('success' => true,'action' => $action, 'nbIntervals' => count($intervals)); | 665 | + |
666 | + return ['success' => true, 'action' => $action, 'nbIntervals' => count($intervals)]; | ||
438 | } | 667 | } |
439 | - | ||
440 | - | ||
441 | - public function getUploadedObject($name, $format, $onlyDescription = false) | 668 | + |
669 | + /** | ||
670 | + * Create interval element | ||
671 | + * @param $interval | ||
672 | + * @return DOMElement | ||
673 | + */ | ||
674 | + protected function createIntervalElement($interval) | ||
442 | { | 675 | { |
443 | - if (strpos($name,'.txt') !== false || strpos($name,'.asc') !== false || strpos($name,'.') == false) { | ||
444 | - $attributesToReturn = $this->text2amda(USERTEMPDIR.$name, $onlyDescription); | ||
445 | - $attributesToReturn['objName'] = $name; | ||
446 | - $attributesToReturn['objFormat'] = $format; | ||
447 | - | ||
448 | - return $attributesToReturn; | 676 | + $newInterval = $this->objectDom->createElement('intervals'); |
677 | + $newInterval->appendChild($this->objectDom->createElement('start', $interval->start)); | ||
678 | + $newInterval->appendChild($this->objectDom->createElement('stop', $interval->stop)); | ||
679 | + return $newInterval; | ||
680 | + } | ||
681 | + | ||
682 | + /** | ||
683 | + * Intersect time tables | ||
684 | + * @param $obj | ||
685 | + * @return array|string | ||
686 | + */ | ||
687 | + public function intersect($obj) | ||
688 | + { | ||
689 | + $intervals = 0; | ||
690 | + for ($iId = 0; $iId < count($obj->ids); $iId++) { | ||
691 | + $table[$iId] = $this->loadIntervalsFromTT($obj->ids[$iId]); | ||
692 | + for ($jId = 0; $jId < count($table[$iId]['intervals']); $jId++) { | ||
693 | + $interval[$iId][$jId][0] = $table[$iId]['intervals'][$jId]['start']; | ||
694 | + $interval[$iId][$jId][1] = $table[$iId]['intervals'][$jId]['stop']; | ||
695 | + } | ||
696 | + $intervals += count($interval[$iId]); | ||
449 | } | 697 | } |
450 | - | ||
451 | - if ($format == 'VOT') { | ||
452 | - $attributesToReturn = $this->vot2amda(USERTEMPDIR.$name, $onlyDescription); | ||
453 | - $attributesToReturn['objName'] = $name; | ||
454 | - $attributesToReturn['objFormat'] = $format; | ||
455 | - | ||
456 | - return $attributesToReturn; | ||
457 | - } | ||
458 | - | ||
459 | - if (strpos($name,'.xml') !== false) { | ||
460 | - $temp = explode('.xml', $name); | ||
461 | - $name = $temp[0]; | 698 | + if ($intervals > 10000) { |
699 | + set_time_limit(1800); | ||
462 | } | 700 | } |
463 | - | ||
464 | - if (!file_exists(USERTEMPDIR.$name.'.xml')) | ||
465 | - return array('error' => 'no such name'); | ||
466 | - | ||
467 | - $this->objectDom->load(USERTEMPDIR.$name.'.xml'); | ||
468 | - if (!($objToGet = $this->objectDom->getElementsByTagName('timetable')->item(0)) && | ||
469 | - !($objToGet = $this->objectDom->getElementsByTagName('TimeTable')->item(0))) | ||
470 | - return array('error' => 'no time table'); | ||
471 | 701 | ||
472 | - $attributes = $objToGet -> childNodes; | ||
473 | - $attributesToReturn['name'] = $name; | ||
474 | - $attributesToReturn['objName'] = $name; | ||
475 | - $attributesToReturn['objFormat'] = $format; | 702 | + // Sort intervals in time tables |
703 | + sort($interval[0]); | ||
704 | + sort($interval[1]); | ||
476 | 705 | ||
477 | - foreach($attributes as $attribute) { | ||
478 | - if($attribute->nodeType == XML_ELEMENT_NODE){ | ||
479 | - if ($attribute->tagName == 'intervals') { | ||
480 | - $start = $attribute -> getElementsByTagName('start')->item(0) -> nodeValue; | ||
481 | - $stop = $attribute -> getElementsByTagName('stop')->item(0) -> nodeValue; | ||
482 | - if (!$onlyDescription) | ||
483 | - $attributesToReturn['intervals'][] = array('start' => $start, 'stop' => $stop); | ||
484 | - } | ||
485 | - else if ($attribute->tagName == 'Interval') { | ||
486 | - $start = $attribute -> getElementsByTagName('Start')->item(0) -> nodeValue; | ||
487 | - $stop = $attribute -> getElementsByTagName('Stop')->item(0) -> nodeValue; | ||
488 | - if (!$onlyDescription) | ||
489 | - $attributesToReturn['intervals'][] = array('start' => $start, 'stop' => $stop); | ||
490 | - } | ||
491 | - else { | ||
492 | - switch (strtolower($attribute->tagName)) { | ||
493 | - case 'created' : | ||
494 | - $attributesToReturn['created'] = $attribute->nodeValue; | ||
495 | - break; | ||
496 | - case 'chain' : | ||
497 | - case 'source' : | ||
498 | - $attributesToReturn['description'] = $attribute->nodeValue; | ||
499 | - break; | ||
500 | - default: break; | ||
501 | - } | 706 | + $iId = 0; |
707 | + $jId = 0; | ||
708 | + $line = 0; | ||
709 | + | ||
710 | + while (($iId < count($interval[0])) && ($jId < count($interval[1]))) { | ||
711 | + $inter = $this->callIntersection($interval[0][$iId], $interval[1][$jId]); | ||
712 | + | ||
713 | + if ($inter[0][0] != 0 && $inter[0][1] != 0) { | ||
714 | + $start[$line] = $inter[0][0]; | ||
715 | + $stop[$line] = $inter[0][1]; | ||
716 | + $line++; | ||
717 | + } | ||
718 | + | ||
719 | + if ($interval[0][$iId][1] < $interval[1][$jId][1]) { | ||
720 | + $iId++; | ||
721 | + } else { | ||
722 | + $jId++; | ||
723 | + } | ||
724 | + } | ||
725 | + | ||
726 | + // Intersection is empty | ||
727 | + if ($line == 0) { | ||
728 | + $result = "empty"; | ||
729 | + } else { | ||
730 | + $objTT->name = $obj->name; // FIXME $objTT is undefined | ||
731 | + $objTT->nodeType = 'timeTable'; | ||
732 | + $objTT->leaf = true; | ||
733 | + $objTT->created = null; | ||
734 | + $objTT->history = $obj->history; | ||
735 | + for ($iId = 0; $iId < count($start); $iId++) { | ||
736 | + $inter = new stdClass(); | ||
737 | + $inter->start = $start[$iId]; | ||
738 | + $inter->stop = $stop[$iId]; | ||
739 | + $objTT->intervals[] = $inter; | ||
740 | + } | ||
741 | + $objTT->nbIntervals = count($start); | ||
742 | + | ||
743 | + if (count($objTT->intervals) == 0) { | ||
744 | + $result = "empty"; | ||
745 | + } else { | ||
746 | + $this->objectDom = new DomDocument('1.0'); | ||
747 | + $this->objectDom->formatOutput = true; | ||
748 | + $result = $this->createObject($objTT, $folder); // FIXME $folder is undefined | ||
749 | + | ||
750 | + if (!isset($result['error'])) { | ||
751 | + $this->saveIntervals($result['id'], $objTT->intervals, 'intersect'); | ||
502 | } | 752 | } |
503 | } | 753 | } |
504 | } | 754 | } |
505 | - return $attributesToReturn; | 755 | + return $result; |
506 | } | 756 | } |
507 | 757 | ||
508 | - //TODO getObject only!!!! => change DD_Search output | ||
509 | - public function getTmpObject($folderId, $name, $onlyDescription = false) { | ||
510 | - $filePath = USERWORKINGDIR.$folderId.'/'.$name.'.xml'; | ||
511 | - if (!file_exists($filePath)) | ||
512 | - return array('error' => 'Cannot find result file'); | ||
513 | - | ||
514 | - $dom = new DomDocument('1.0'); | ||
515 | - $dom->formatOutput = true; | ||
516 | - | ||
517 | - if (!$dom -> load($filePath)) | ||
518 | - return array('error' => 'Cannot load result file'); | ||
519 | - | ||
520 | - $descNodes = $dom->getElementsByTagName('description'); | ||
521 | - if ($descNodes->length > 0) | ||
522 | - $attributesToReturn['description'] = $descNodes->item(0)->nodeValue; | ||
523 | - | ||
524 | - $creatNodes = $dom->getElementsByTagName('created'); | ||
525 | - if ($creatNodes->length > 0) | ||
526 | - $attributesToReturn['created'] = $creatNodes->item(0)->nodeValue; | ||
527 | - | ||
528 | - $histNodes = $dom->getElementsByTagName('history'); | ||
529 | - if ($histNodes->length > 0) | ||
530 | - $attributesToReturn['history'] = $histNodes->item(0)->nodeValue; | ||
531 | - | ||
532 | - $attributesToReturn['objName'] = $name; | ||
533 | - $attributesToReturn['folderId'] = $folderId; | ||
534 | - | ||
535 | - if (!$onlyDescription) | ||
536 | - { | ||
537 | - $intNodes = $dom->getElementsByTagName('intervals'); | ||
538 | - foreach ($intNodes as $intNode) | ||
539 | - { | ||
540 | - $startNodes = $intNode->getElementsByTagName('start'); | ||
541 | - if ($startNodes->length <= 0) | ||
542 | - return array('error' => 'Error detected in result file'); | ||
543 | - $stopNodes = $intNode->getElementsByTagName('stop'); | ||
544 | - if ($stopNodes->length <= 0) | ||
545 | - return array('error' => 'Error detected in result file'); | ||
546 | - $attributesToReturn['intervals'][] = array('start' => $startNodes->item(0)->nodeValue, | ||
547 | - 'stop' => $stopNodes->item(0)->nodeValue); | ||
548 | - } | 758 | + /** |
759 | + * Call intersection | ||
760 | + * @param $fst | ||
761 | + * @param $snd | ||
762 | + * @return array | ||
763 | + */ | ||
764 | + protected function callIntersection($fst, $snd) | ||
765 | + { | ||
766 | + $inf = ($fst[0] > $snd[0]) ? $fst[0] : $snd[0]; | ||
767 | + $sup = ($fst[1] < $snd[1]) ? $fst[1] : $snd[1]; | ||
768 | + $inter[] = ($inf >= $sup) ? [0, 0] : [$inf, $sup]; | ||
769 | + return $inter; | ||
770 | + } | ||
771 | + | ||
772 | + /** | ||
773 | + * Valid name object | ||
774 | + * TODO getObject only!!!! => change DD_Search output | ||
775 | + * @param $p | ||
776 | + * @return array | ||
777 | + */ | ||
778 | + public function validNameObject($p) | ||
779 | + { | ||
780 | + // overwritten | ||
781 | + $res = parent::validNameObject($p); | ||
782 | + | ||
783 | + if (!$res['valid']) { | ||
784 | + return $res; | ||
785 | + } | ||
786 | + | ||
787 | + //no space | ||
788 | + if (strpos($p->name, ' ') === false) { | ||
789 | + return ['valid' => true]; | ||
549 | } | 790 | } |
550 | - | ||
551 | - return $attributesToReturn; | 791 | + |
792 | + return ['valid' => false, 'error' => 'Space character is not allowed']; | ||
552 | } | 793 | } |
553 | 794 | ||
554 | - /* | ||
555 | - * merge time tables | ||
556 | - */ | ||
557 | - public function merge($obj) { | ||
558 | /** | 795 | /** |
559 | - * Array of intervals, used like : | ||
560 | - * [{start:'2010-01-01T23:00:00',stop:'2011-01-01T20:00:00'},{start:'2009-01-01T23:00:00',stop:'2010-01-01T20:00:00'}] | ||
561 | - * $attributesToReturn['intervals'][] = array('start' => $start, 'stop' => $stop); | ||
562 | - */ | ||
563 | - | ||
564 | - $intervals = 0; | ||
565 | - | ||
566 | - for ( $i = 0; $i < count($obj->ids); $i++ ) { | ||
567 | - $table[$i] = $this->loadIntervalsFromTT($obj->ids[$i]); | ||
568 | - for ($j=0; $j < count($table[$i]['intervals']); $j++) { | ||
569 | - $interval[$i][$j][0] = $table[$i]['intervals'][$j]['start']; | ||
570 | - $interval[$i][$j][1] = $table[$i]['intervals'][$j]['stop']; | ||
571 | - } | ||
572 | - $intervals += count($interval[$i]); | ||
573 | - } | ||
574 | - if ( $intervals > 10000) set_time_limit(1800); | ||
575 | - | ||
576 | - $final = array(); | ||
577 | - for ( $i = 0; $i < count($obj->ids); $i++ ) { | ||
578 | - $final = array_merge($final, $interval[$i]); | ||
579 | - } | ||
580 | - sort($final); | ||
581 | - | ||
582 | - // Algorithm of union | ||
583 | - $line = 0; | ||
584 | - $i = 0; | ||
585 | - $a = $final[$i][0]; | ||
586 | - while ($i < count($final)-1) { | ||
587 | - if ($final[$i+1][1] <= $final[$i][1]) | ||
588 | - { | ||
589 | - array_splice($final,$i+1,1); | ||
590 | - } | ||
591 | - else if (($final[$i+1][0] <= $final[$i][1]) && ($final[$i+1][1] >= $final[$i][1])) | ||
592 | - { | ||
593 | - $i++; | ||
594 | - } | ||
595 | - else { | ||
596 | - $start[$line] = $a; | ||
597 | - $stop[$line] = $final[$i][1]; | ||
598 | - $i++; | ||
599 | - $line++; | ||
600 | - $a = $final[$i][0]; | ||
601 | - } | ||
602 | - } | ||
603 | - $start[$line] = $a; | ||
604 | - $stop[$line] = $final[$i][1]; | ||
605 | - $line++; | ||
606 | - | ||
607 | - $objTT = new stdClass(); | ||
608 | - $objTT->name = $obj->name; | ||
609 | - $objTT->nodeType = 'timeTable'; | ||
610 | - $objTT->leaf = true; | ||
611 | - $objTT->created = null; | ||
612 | - $objTT->history = $obj->history; | ||
613 | - for ($i=0; $i < count($start); $i++) { | ||
614 | - $inter = new stdClass(); | ||
615 | - $inter->start = $start[$i]; | ||
616 | - $inter->stop = $stop[$i]; | ||
617 | - $objTT->intervals[] = $inter; | ||
618 | - } | ||
619 | - $objTT->nbIntervals = count($start); | ||
620 | - $this->objectDom = new DomDocument('1.0'); | ||
621 | - $this->objectDom->formatOutput = true; | ||
622 | - | ||
623 | - $res = $this->createParameter($objTT, $folder); | ||
624 | - if ($res['error']) | ||
625 | - return $res; | ||
626 | - | ||
627 | - $this->saveIntervals($res['id'],$objTT->intervals,'merge'); | ||
628 | - | ||
629 | - return $res; | ||
630 | - | ||
631 | - } | ||
632 | - | ||
633 | -/* | ||
634 | - * intersect time tables | ||
635 | - */ | ||
636 | - public function intersect($obj) { | ||
637 | - | ||
638 | - for ( $i = 0; $i < count($obj->ids); $i++ ) { | ||
639 | - $table[$i] = $this->loadIntervalsFromTT($obj->ids[$i]); | ||
640 | - for ($j=0; $j < count($table[$i]['intervals']); $j++) { | ||
641 | - $interval[$i][$j][0] = $table[$i]['intervals'][$j]['start']; | ||
642 | - $interval[$i][$j][1] = $table[$i]['intervals'][$j]['stop']; | ||
643 | - } | ||
644 | - $intervals += count($interval[$i]); | ||
645 | - } | ||
646 | - if ( $intervals > 10000) set_time_limit(1800); | ||
647 | - | ||
648 | - // Sort intervals in time tables | ||
649 | - sort($interval[0]); | ||
650 | - sort($interval[1]); | ||
651 | - | ||
652 | - $i = 0; | ||
653 | - $j = 0; | ||
654 | - $line = 0; | ||
655 | - | ||
656 | - while ( ($i < count($interval[0])) && ($j < count($interval[1])) ) { | ||
657 | - $inter = $this->call_intersection($interval[0][$i], $interval[1][$j]); | ||
658 | - | ||
659 | - if ($inter[0][0] != 0 && $inter[0][1] != 0) | ||
660 | - { | ||
661 | - $start[$line] = $inter[0][0]; | ||
662 | - $stop[$line] = $inter[0][1]; | ||
663 | - $line++; | ||
664 | - } | ||
665 | - | ||
666 | - if ( $interval[0][$i][1] < $interval[1][$j][1] ) { $i++; } | ||
667 | - else { $j++; } | ||
668 | - } | ||
669 | - | ||
670 | - // Intersection is empty | ||
671 | - if ( $line == 0 ) { | ||
672 | - $result ="empty"; | ||
673 | - } | ||
674 | - else { | ||
675 | - $objTT->name = $obj->name; | ||
676 | - $objTT->nodeType = 'timeTable'; | ||
677 | - $objTT->leaf = true; | ||
678 | - $objTT->created = null; | ||
679 | - $objTT->history = $obj->history; | ||
680 | - for ($i=0; $i < count($start); $i++) { | ||
681 | - $inter = new stdClass(); | ||
682 | - $inter->start = $start[$i]; | ||
683 | - $inter->stop = $stop[$i]; | ||
684 | - $objTT->intervals[] = $inter; | ||
685 | - } | ||
686 | - $objTT->nbIntervals = count($start); | ||
687 | - | ||
688 | - if (count($objTT->intervals) == 0) | ||
689 | - $result ="empty"; | ||
690 | - else | ||
691 | - { | ||
692 | - $this->objectDom = new DomDocument('1.0'); | ||
693 | - $this->objectDom->formatOutput = true; | ||
694 | - $result = $this->createObject($objTT, $folder); | ||
695 | - | ||
696 | - if (!isset($result['error'])) | ||
697 | - $this->saveIntervals($result['id'],$objTT->intervals,'intersect'); | ||
698 | - | ||
699 | - } | ||
700 | - } | ||
701 | - return $result; | ||
702 | - } | ||
703 | - | ||
704 | - | ||
705 | - function validNameObject($p){ | ||
706 | - // overwritten | ||
707 | - $res = parent::validNameObject($p); | ||
708 | - | ||
709 | - if (!$res['valid']) | ||
710 | - return $res; | ||
711 | - | ||
712 | - //no space | ||
713 | - if (strpos($p->name, ' ') === FALSE) | ||
714 | - return array('valid' => true); | ||
715 | - | ||
716 | - return array('valid' => false, 'error' => 'Space character is not allowed'); | ||
717 | - } | ||
718 | - | ||
719 | - public function copyTT($src_path, $dst_path, $newId, $newName, $newDescription = NULL) | 796 | + * Copy time table |
797 | + * @param $src_path | ||
798 | + * @param $dst_path | ||
799 | + * @param $newId | ||
800 | + * @param $newName | ||
801 | + * @param null $newDescription | ||
802 | + * @return bool | ||
803 | + */ | ||
804 | + public function copyTT($src_path, $dst_path, $newId, $newName, $newDescription = null) | ||
720 | { | 805 | { |
721 | - if (!file_exists($src_path)) | ||
722 | - return FALSE; | ||
723 | - | ||
724 | - if (!is_dir($dst_path)) | ||
725 | - return FALSE; | ||
726 | - | 806 | + if (!file_exists($src_path)) { |
807 | + return false; | ||
808 | + } | ||
809 | + | ||
810 | + if (!is_dir($dst_path)) { | ||
811 | + return false; | ||
812 | + } | ||
813 | + | ||
727 | $dom = new DomDocument('1.0'); | 814 | $dom = new DomDocument('1.0'); |
728 | $dom->formatOutput = true; | 815 | $dom->formatOutput = true; |
729 | - | ||
730 | - if (!$dom->load($src_path)) | ||
731 | - return FALSE; | ||
732 | - | 816 | + |
817 | + if (!$dom->load($src_path)) { | ||
818 | + return false; | ||
819 | + } | ||
820 | + | ||
733 | $timeTableNodes = $dom->getElementsByTagName('timetable'); | 821 | $timeTableNodes = $dom->getElementsByTagName('timetable'); |
734 | - if ($timeTableNodes->length <= 0) | ||
735 | - return FALSE; | ||
736 | - | 822 | + if ($timeTableNodes->length <= 0) { |
823 | + return false; | ||
824 | + } | ||
825 | + | ||
737 | $timeTableNode = $timeTableNodes->item(0); | 826 | $timeTableNode = $timeTableNodes->item(0); |
738 | - | 827 | + |
739 | $timeTableNode->setAttribute('xml:id', $newId); | 828 | $timeTableNode->setAttribute('xml:id', $newId); |
740 | - | 829 | + |
741 | $nameNodes = $timeTableNode->getElementsByTagName('name'); | 830 | $nameNodes = $timeTableNode->getElementsByTagName('name'); |
742 | - | 831 | + |
743 | if ($nameNodes->length <= 0) { | 832 | if ($nameNodes->length <= 0) { |
744 | //create name node (normally never append) | 833 | //create name node (normally never append) |
745 | $nameNode = $dom->createElement('name'); | 834 | $nameNode = $dom->createElement('name'); |
746 | $timeTableNode->appendChild($nameNode); | 835 | $timeTableNode->appendChild($nameNode); |
747 | - } | ||
748 | - else | 836 | + } else { |
749 | $nameNode = $nameNodes->item(0); | 837 | $nameNode = $nameNodes->item(0); |
750 | - | 838 | + } |
839 | + | ||
751 | $nameNode->nodeValue = $newName; | 840 | $nameNode->nodeValue = $newName; |
752 | - | 841 | + |
753 | if (isset($newDescription) && !empty($newDescription)) { | 842 | if (isset($newDescription) && !empty($newDescription)) { |
754 | $descriptionNodes = $timeTableNode->getElementsByTagName('description'); | 843 | $descriptionNodes = $timeTableNode->getElementsByTagName('description'); |
755 | if ($descriptionNodes->length <= 0) { | 844 | if ($descriptionNodes->length <= 0) { |
756 | //create description node (normally never append) | 845 | //create description node (normally never append) |
757 | $descriptionNode = $dom->createElement('description'); | 846 | $descriptionNode = $dom->createElement('description'); |
758 | $timeTableNode->appendChild($descriptionNode); | 847 | $timeTableNode->appendChild($descriptionNode); |
759 | - } | ||
760 | - else | 848 | + } else { |
761 | $descriptionNode = $descriptionNodes->item(0); | 849 | $descriptionNode = $descriptionNodes->item(0); |
762 | - | 850 | + } |
851 | + | ||
763 | $descriptionNode->nodeValue = $newDescription; | 852 | $descriptionNode->nodeValue = $newDescription; |
764 | } | 853 | } |
765 | - | ||
766 | - $dst_file_path = $dst_path."/".$newId.".xml"; | ||
767 | - if ($dom->save($dst_file_path) === FALSE) | ||
768 | - return FALSE; | ||
769 | - | ||
770 | - chgrp($dst_file_path, APACHE_USER); | ||
771 | - chmod($dst_file_path, 0775); | ||
772 | - | ||
773 | - return TRUE; | 854 | + |
855 | + $dstFilePath = $dst_path . "/" . $newId . ".xml"; | ||
856 | + if ($dom->save($dstFilePath) === false) { | ||
857 | + return false; | ||
858 | + } | ||
859 | + | ||
860 | + chgrp($dstFilePath, APACHE_USER); | ||
861 | + chmod($dstFilePath, 0775); | ||
862 | + | ||
863 | + return true; | ||
864 | + } | ||
865 | + | ||
866 | + /** | ||
867 | + * Rename in resource | ||
868 | + * @param $name | ||
869 | + * @param $id | ||
870 | + * @return bool | ||
871 | + */ | ||
872 | + protected function renameInResource($name, $id) | ||
873 | + { | ||
874 | + if (!file_exists(USERTTDIR . $id . '.xml')) { | ||
875 | + return false; | ||
876 | + } | ||
877 | + | ||
878 | + $this->objectDom->load(USERTTDIR . $id . '.xml'); | ||
879 | + if (!($objToRename = $this->objectDom->getElementById($id))) { | ||
880 | + return false; | ||
881 | + } | ||
882 | + $objToRename->getElementsByTagName('name')->item(0)->nodeValue = $name; | ||
883 | + $this->objectDom->save(USERTTDIR . $id . '.xml'); | ||
884 | + | ||
885 | + return true; | ||
886 | + } | ||
887 | + | ||
888 | + /** | ||
889 | + * Delete parameter | ||
890 | + * @param $id | ||
891 | + */ | ||
892 | + protected function deleteParameter($id) | ||
893 | + { | ||
894 | + if (file_exists(USERTTDIR . $id . '.xml')) { | ||
895 | + unlink(USERTTDIR . $id . '.xml'); | ||
896 | + } | ||
897 | + } | ||
898 | + | ||
899 | + /** | ||
900 | + * Rename only | ||
901 | + * @param $p | ||
902 | + * @return bool | ||
903 | + */ | ||
904 | + protected function renameOnly($p) | ||
905 | + { | ||
906 | + //if (!($p->intervals)) return true; | ||
907 | + return false; | ||
774 | } | 908 | } |
775 | } | 909 | } |
776 | -?> |