Commit 139a8045726ec6e43caa7adcf090567c81a7f345

Authored by Nathanaël Jourdane
1 parent 5f8bd1f5

autocleanup

Showing 1 changed file with 627 additions and 555 deletions   Show diff stats
php/classes/TimeTableMgr.php
... ... @@ -7,22 +7,22 @@
7 7 *
8 8 */
9 9  
10   -function timeFormat($myString)
  10 +function timeFormat($myString)
11 11 {
12   - if (format == "Y z H i s") {
  12 + if (format == "Y z H i s") {
13 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"]);
  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 19 }
20   - return date(format,strtotime($myString));
  20 + return date(format, strtotime($myString));
21 21 }
22 22  
23 23 class TimeTableMgr extends AmdaObjectMgr
24   -{
25   - function __construct($user = NULL, $sharedObject = FALSE)
  24 +{
  25 + function __construct($user = null, $sharedObject = false)
26 26 {
27 27 parent::__construct('Tt.xml');
28 28 $this->contentRootId = 'timeTable-treeRootNode';
... ... @@ -33,20 +33,20 @@ class TimeTableMgr extends AmdaObjectMgr
33 33 $this->id_prefix = 'tt_';
34 34  
35 35 if (!$sharedObject && !file_exists($this->xmlName)) {
36   - $this->createDom();
37   - $this->xp = new domxpath($this->contentDom);
  36 + $this->createDom();
  37 + $this->xp = new domxpath($this->contentDom);
38 38 }
39 39 }
40   -
41   - protected function createDom()
  40 +
  41 + protected function createDom()
42 42 {
43 43 $types = array('timetab' => 'timeTable', 'catalog' => 'catalog');
44 44  
45 45 $rootElement = $this->contentDom->createElement('ws');
46   -
  46 +
47 47 foreach ($types as $key => $value) {
48   - $contentId = $value.'-treeRootNode';
49   - $contentTag = $key.'List';
  48 + $contentId = $value . '-treeRootNode';
  49 + $contentTag = $key . 'List';
50 50 $typeElement = $this->contentDom->createElement($contentTag);
51 51 $typeElement->setAttribute('xml:id', $contentId);
52 52 $rootElement->appendChild($typeElement);
... ... @@ -58,360 +58,557 @@ class TimeTableMgr extends AmdaObjectMgr
58 58 /*
59 59 * rename Time Table in id.xml
60 60 */
61   - protected function renameInResource($name, $id)
  61 +
  62 +
  63 + function getObject($id, $nodeType)
62 64 {
63   - if (!file_exists(USERTTDIR.$id.'.xml')) return false;
  65 + if (substr($nodeType, 0, 6) == 'shared') {
  66 + //Shared object
  67 + $sharedObjMgr = new SharedObjectsMgr();
  68 + $path = $sharedObjMgr->getDataFilePath(str_replace('shared', '', $nodeType), $id);
  69 + } else {
  70 + $path = USERTTDIR . $id . '.xml';
  71 + }
64 72  
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;
  73 + if (!file_exists($path)) {
  74 + return array('error' => NO_OBJECT_FILE);
  75 + }
  76 + $this->objectDom->load($path);
  77 + if (!($objToGet = $this->objectDom->getElementById($id))) {
  78 + return array('error' => NO_SUCH_ID);
  79 + }
  80 + $attributesToReturn['id'] = $objToGet->getAttribute('xml:id');
  81 + $attributes = $objToGet->childNodes;
  82 +
  83 + $nbInt = 0;
  84 + foreach ($attributes as $attribute) {
  85 + if ($attribute->nodeType == XML_ELEMENT_NODE) {
  86 + /*if ($attribute->tagName == 'intervals') {
  87 + $start = $attribute -> getElementsByTagName('start')->item(0) -> nodeValue;
  88 + $stop = $attribute -> getElementsByTagName('stop')->item(0) -> nodeValue;
  89 + $attributesToReturn['intervals'][] = array('start' => $start, 'stop' => $stop);
  90 + }
  91 + else
  92 + $attributesToReturn[$attribute->tagName] = $attribute->nodeValue;*/
  93 + //BRE - load all except intervals - Intervals will be loaded later with 'loadIntervalsFromTT' function
  94 + if ($attribute->tagName != 'intervals') {
  95 + $attributesToReturn[$attribute->tagName] = $attribute->nodeValue;
  96 + } else {
  97 + $nbInt++;
  98 + }
  99 + }
  100 + }
  101 +
  102 + $attributesToReturn['nbIntervals'] = $nbInt;
  103 +
  104 + return $attributesToReturn;
71 105 }
72 106  
73   - protected function deleteParameter($id)
  107 + public function modifyObject($p)
74 108 {
75   - if (file_exists(USERTTDIR.$id.'.xml')) unlink(USERTTDIR.$id.'.xml');
  109 + $folder = $this->getObjectFolder($p->id);
  110 +
  111 + //Copy TT in a tempory file
  112 + $ttFilePath = USERTTDIR . $p->id . '.xml';
  113 + $tmpFileExist = false;
  114 + if (file_exists($ttFilePath)) {
  115 + $tmpFileExist = copy($ttFilePath, $ttFilePath . ".tmp");
  116 + }
  117 +
  118 + //Delete TT
  119 + $this->deleteObject($p);
  120 +
  121 + //Save modifications
  122 + try {
  123 + $result = $this->createObject($p, $folder);
  124 + if ($result['error']) {
  125 + throw new Exception($result['error']);
  126 + }
  127 + if ($tmpFileExist) {
  128 + unlink($ttFilePath . ".tmp");
  129 + }
  130 + return array('id' => $p->id, 'info' => $result['info']);
  131 + } catch (Exception $e) {
  132 + //Restore TT file
  133 + if ($tmpFileExist) {
  134 + copy($ttFilePath . ".tmp", $ttFilePath);
  135 + unlink($ttFilePath . ".tmp");
  136 + }
  137 + return array('error' => $e->getMessage());
  138 + }
76 139 }
77 140  
78 141 /*
79 142 * Check if difference is name and info only
80 143 */
81   - protected function renameOnly($p) {
82   - //if (!($p->intervals)) return true;
83   - return false;
  144 +
  145 + public function createObject($p, $folder)
  146 + {
  147 + if ($p->leaf) {
  148 + $result = $this->createParameter($p, $folder);
  149 + if ($result['error']) {
  150 + return $result;
  151 + }
  152 + $cacheMgr = new TimeTableCacheMgr();
  153 + if (isset($p->cacheToken) && ($p->cacheToken != '')) {
  154 + $resultSaveInt = $cacheMgr->saveInTT($result['id'], "update", $p->cacheToken);
  155 + if (!$resultSaveInt['success']) {
  156 + if ($resultSaveInt['message']) {
  157 + return array('error' => $resultSaveInt['message']);
  158 + } else {
  159 + return array('error' => 'Unknown error during intervals save');
  160 + }
  161 + }
  162 + }
  163 + return $result;
  164 + }
  165 + // else return $this->createFolder($p);
  166 + //TODO check if this is possible?
  167 + else {
  168 + return array('error' => 'createFolder should be called from RENAME');
  169 + }
84 170 }
85   -
86   - /*
87   - * In case of catalogs
88   - */
89   - protected function setParamDescription($param) { }
90 171  
91   -
92 172 /*
93   - * Create Time Table
94   - */
  173 + * In case of catalogs
  174 + */
  175 +
95 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 183 $this->id = $this->setId();
103 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';
  185 + if (!$this->id) {
  186 + return array('error' => ID_CREATION_ERROR);
  187 + }
  188 +
  189 + $this->resFileName = USERTTDIR . $this->id . '.xml';
107 190 //TODO catalog root element = 'timetable'
108 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 195 if ($key != 'id' && $key != 'leaf' && $key != 'nodeType' &&
113 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 +
  207 + } else {
  208 + if ($key != 'intervals') {
  209 + $rootElement->appendChild($this->objectDom->createElement($key, htmlspecialchars($value)));
  210 + }
122 211 }
123   - else if ($key != 'intervals')
124   - $rootElement->appendChild($this->objectDom->createElement($key, htmlspecialchars($value)));
  212 + }
125 213 }
  214 + }
126 215  
127 216 $this->objectDom->appendChild($rootElement);
128 217 $this->objectDom->save($this->resFileName);
129 218 $obj = new stdClass();
130 219 $obj->name = $p->name;
131 220 $obj->intervals = $p->nbIntervals;
132   - $this -> addToContent($obj, $folder);
133   - return array('id' => $this->id,'created' => $this->created,'info' =>$obj->intervals.' intervals' );
  221 + $this->addToContent($obj, $folder);
  222 + return array('id' => $this->id, 'created' => $this->created, 'info' => $obj->intervals . ' intervals');
134 223 }
135 224  
136   - protected function call_intersection($fst, $snd)
  225 +
  226 + /*
  227 + * Create Time Table
  228 + */
  229 +
  230 + protected function setParamDescription($param)
137 231 {
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;
143 232 }
144   -
  233 +
  234 + public function getUploadedObject($name, $format, $onlyDescription = false)
  235 + {
  236 + if (strpos($name, '.txt') !== false || strpos($name, '.asc') !== false || strpos($name, '.') == false) {
  237 + $attributesToReturn = $this->text2amda(USERTEMPDIR . $name, $onlyDescription);
  238 + $attributesToReturn['objName'] = $name;
  239 + $attributesToReturn['objFormat'] = $format;
  240 +
  241 + return $attributesToReturn;
  242 + }
  243 +
  244 + if ($format == 'VOT') {
  245 + $attributesToReturn = $this->vot2amda(USERTEMPDIR . $name, $onlyDescription);
  246 + $attributesToReturn['objName'] = $name;
  247 + $attributesToReturn['objFormat'] = $format;
  248 +
  249 + return $attributesToReturn;
  250 + }
  251 +
  252 + if (strpos($name, '.xml') !== false) {
  253 + $temp = explode('.xml', $name);
  254 + $name = $temp[0];
  255 + }
  256 +
  257 + if (!file_exists(USERTEMPDIR . $name . '.xml')) {
  258 + return array('error' => 'no such name');
  259 + }
  260 +
  261 + $this->objectDom->load(USERTEMPDIR . $name . '.xml');
  262 + if (!($objToGet = $this->objectDom->getElementsByTagName('timetable')->item(0)) &&
  263 + !($objToGet = $this->objectDom->getElementsByTagName('TimeTable')->item(0))) {
  264 + return array('error' => 'no time table');
  265 + }
  266 +
  267 + $attributes = $objToGet->childNodes;
  268 + $attributesToReturn['name'] = $name;
  269 + $attributesToReturn['objName'] = $name;
  270 + $attributesToReturn['objFormat'] = $format;
  271 +
  272 + foreach ($attributes as $attribute) {
  273 + if ($attribute->nodeType == XML_ELEMENT_NODE) {
  274 + if ($attribute->tagName == 'intervals') {
  275 + $start = $attribute->getElementsByTagName('start')->item(0)->nodeValue;
  276 + $stop = $attribute->getElementsByTagName('stop')->item(0)->nodeValue;
  277 + if (!$onlyDescription) {
  278 + $attributesToReturn['intervals'][] = array('start' => $start, 'stop' => $stop);
  279 + }
  280 + } else {
  281 + if ($attribute->tagName == 'Interval') {
  282 + $start = $attribute->getElementsByTagName('Start')->item(0)->nodeValue;
  283 + $stop = $attribute->getElementsByTagName('Stop')->item(0)->nodeValue;
  284 + if (!$onlyDescription) {
  285 + $attributesToReturn['intervals'][] = array('start' => $start, 'stop' => $stop);
  286 + }
  287 + } else {
  288 + switch (strtolower($attribute->tagName)) {
  289 + case 'created' :
  290 + $attributesToReturn['created'] = $attribute->nodeValue;
  291 + break;
  292 + case 'chain' :
  293 + case 'source' :
  294 + $attributesToReturn['description'] = $attribute->nodeValue;
  295 + break;
  296 + default:
  297 + break;
  298 + }
  299 + }
  300 + }
  301 + }
  302 + }
  303 + return $attributesToReturn;
  304 + }
  305 +
145 306 /*
146 307 * Uploaded text file => convert to array
147 308 */
148   - protected function text2amda($tmp_file, $onlyDescription = false)
149   - {
  309 +
  310 + protected function text2amda($tmp_file, $onlyDescription = false)
  311 + {
150 312 $suffix = explode('.', basename($tmp_file));
151   - $lines = file($tmp_file,FILE_SKIP_EMPTY_LINES);
152   - $description="Uploaded Time Table".PHP_EOL;
  313 + $lines = file($tmp_file, FILE_SKIP_EMPTY_LINES);
  314 + $description = "Uploaded Time Table" . PHP_EOL;
153 315  
154 316 $recordsNumber = count($lines);
155 317 $descNumber = 0;
156   -
157   - foreach ($lines as $line)
158   - {
  318 +
  319 + foreach ($lines as $line) {
159 320 if ($line[0] == '#') {
160   - $description=$description.PHP_EOL.substr($line,1,-1);
161   - }
162   - else {
163   - $date = explode(' ', trim(preg_replace('!\s+!', ' ',$line)));
164   -
  321 + $description = $description . PHP_EOL . substr($line, 1, -1);
  322 + } else {
  323 + $date = explode(' ', trim(preg_replace('!\s+!', ' ', $line)));
  324 +
165 325 if (!strtotime(trim($date[0]))) {
166   - $description=$description.PHP_EOL.$line;
  326 + $description = $description . PHP_EOL . $line;
167 327 $descNumber++;
168 328 continue;
169 329 }
170 330 // check if it is ISO format
171   - if (!isset($isIso))
  331 + if (!isset($isIso)) {
172 332 $isIso = preg_match('/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})$/', trim($date[0]));
173   -
  333 + }
  334 +
174 335 if (!$isIso) {
175 336 // y-m-d h:m:s for example
176 337 $dateLength = count($date) / 2;
177 338  
178 339 $tempStart = $date[0];
179 340 $tempStop = $date[$dateLength];
180   -
  341 +
181 342 if ($dateLength > 1) {
182   - for ($i = 1; $i < $dateLength; $i++)
183   - $tempStart.= $date[$i];
184   -
185   - for ($i = $dateLength + 1; $i < $dateLength * 2; $i++)
  343 + for ($i = 1; $i < $dateLength; $i++) {
  344 + $tempStart .= $date[$i];
  345 + }
  346 +
  347 + for ($i = $dateLength + 1; $i < $dateLength * 2; $i++) {
186 348 $tempStop .= $date[$i];
  349 + }
187 350 }
188 351  
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);
194   - }
195   - else {
196   - if (!$onlyDescription)
  352 + $startDate = date('Y-m-d\TH:i:s', strtotime($tempStart));
  353 + $stopDate = date('Y-m-d\TH:i:s', strtotime($tempStop));
  354 +
  355 + if (!$onlyDescription) {
  356 + $attributesToReturn['intervals'][] = array('start' => $startDate, 'stop' => $stopDate);
  357 + }
  358 + } else {
  359 + if (!$onlyDescription) {
197 360 $attributesToReturn['intervals'][] = array('start' => trim($date[0]), 'stop' => trim($date[1]));
198   - }
  361 + }
  362 + }
199 363 }
200 364 }
201   - if ( $recordsNumber == $descNumber )
202   - $description = "Looks like we can not read your time format...".PHP_EOL.$description;
203   -
  365 + if ($recordsNumber == $descNumber) {
  366 + $description = "Looks like we can not read your time format..." . PHP_EOL . $description;
  367 + }
  368 +
204 369 $attributesToReturn['description'] = $description;
205   - $attributesToReturn['name'] = basename($tmp_file, '.'.$suffix[1]);
  370 + $attributesToReturn['name'] = basename($tmp_file, '.' . $suffix[1]);
206 371 $attributesToReturn['created'] = date('Y-m-d\TH:i:s');
207 372  
208 373 return $attributesToReturn;
209 374 }
210 375  
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);
  376 + /*
  377 + * Uploaded vot TT => convert to array
  378 + */
  379 + protected function vot2amda($tmp_file, $onlyDescription = false)
  380 + {
  381 + // Load Time table
  382 + $this->objectDom->load($tmp_file);
217 383 $objToGet = $this->objectDom->getElementsByTagName('TABLEDATA')->item(0);
218 384 $attributesToReturn['name'] = $tmp_file;
219   - $attributes = $objToGet -> childNodes;
220   - foreach($attributes as $attribute)
  385 + $attributes = $objToGet->childNodes;
  386 + foreach ($attributes as $attribute) {
221 387 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);
  388 + $start = $attribute->getElementsByTagName('TD')->item(0)->nodeValue;
  389 + $stop = $attribute->getElementsByTagName('TD')->item(1)->nodeValue;
  390 + if (!$onlyDescription) {
  391 + $attributesToReturn['intervals'][] = array('start' => $start, 'stop' => $stop);
  392 + }
226 393 }
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);
  394 + }
  395 + $suffix = explode('.', basename($tmp_file));
  396 + $attributesToReturn['name'] = basename($tmp_file, '.' . $suffix[1]);
  397 + $attributesToReturn['created'] = date('Y-m-d') . "T" . date('H:i:s');
  398 + $attributesToReturn['description'] = htmlspecialchars($this->objectDom->getElementsByTagName('DESCRIPTION')->item(0)->nodeValue);
  399 + return ($attributesToReturn);
232 400 }
233   -
  401 +
234 402 /*****************************************************************
235 403 * PUBLIC FUNCTIONS
236 404 *****************************************************************/
237   -
  405 +
238 406 /*
239 407 * Get Object into Edit
240 408 */
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);
  409 + public function getTmpObject($folderId, $name, $onlyDescription = false)
  410 + {
  411 + $filePath = USERWORKINGDIR . $folderId . '/' . $name . '.xml';
  412 + if (!file_exists($filePath)) {
  413 + return array('error' => 'Cannot find result file');
246 414 }
247   - else {
248   - $path = USERTTDIR.$id.'.xml';
  415 +
  416 + $dom = new DomDocument('1.0');
  417 + $dom->formatOutput = true;
  418 +
  419 + if (!$dom->load($filePath)) {
  420 + return array('error' => 'Cannot load result file');
249 421 }
250 422  
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;
  423 + $descNodes = $dom->getElementsByTagName('description');
  424 + if ($descNodes->length > 0) {
  425 + $attributesToReturn['description'] = $descNodes->item(0)->nodeValue;
  426 + }
256 427  
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');
  428 + $creatNodes = $dom->getElementsByTagName('created');
  429 + if ($creatNodes->length > 0) {
  430 + $attributesToReturn['created'] = $creatNodes->item(0)->nodeValue;
  431 + }
  432 +
  433 + $histNodes = $dom->getElementsByTagName('history');
  434 + if ($histNodes->length > 0) {
  435 + $attributesToReturn['history'] = $histNodes->item(0)->nodeValue;
  436 + }
  437 +
  438 + $attributesToReturn['objName'] = $name;
  439 + $attributesToReturn['folderId'] = $folderId;
  440 +
  441 + if (!$onlyDescription) {
  442 + $intNodes = $dom->getElementsByTagName('intervals');
  443 + foreach ($intNodes as $intNode) {
  444 + $startNodes = $intNode->getElementsByTagName('start');
  445 + if ($startNodes->length <= 0) {
  446 + return array('error' => 'Error detected in result file');
  447 + }
  448 + $stopNodes = $intNode->getElementsByTagName('stop');
  449 + if ($stopNodes->length <= 0) {
  450 + return array('error' => 'Error detected in result file');
295 451 }
  452 + $attributesToReturn['intervals'][] = array(
  453 + 'start' => $startNodes->item(0)->nodeValue,
  454 + 'stop' => $stopNodes->item(0)->nodeValue
  455 + );
296 456 }
297   - return $result;
298 457 }
299   - // else return $this->createFolder($p);
300   - //TODO check if this is possible?
301   - else return array('error' => 'createFolder should be called from RENAME');
  458 +
  459 + return $attributesToReturn;
302 460 }
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']);
  461 +
  462 + public function merge($obj)
  463 + {
  464 + /**
  465 + * Array of intervals, used like :
  466 + * [{start:'2010-01-01T23:00:00',stop:'2011-01-01T20:00:00'},{start:'2009-01-01T23:00:00',stop:'2010-01-01T20:00:00'}]
  467 + * $attributesToReturn['intervals'][] = array('start' => $start, 'stop' => $stop);
  468 + */
  469 +
  470 + $intervals = 0;
  471 +
  472 + for ($i = 0; $i < count($obj->ids); $i++) {
  473 + $table[$i] = $this->loadIntervalsFromTT($obj->ids[$i]);
  474 + for ($j = 0; $j < count($table[$i]['intervals']); $j++) {
  475 + $interval[$i][$j][0] = $table[$i]['intervals'][$j]['start'];
  476 + $interval[$i][$j][1] = $table[$i]['intervals'][$j]['stop'];
  477 + }
  478 + $intervals += count($interval[$i]);
325 479 }
326   - catch (Exception $e) {
327   - //Restore TT file
328   - if ($tmpFileExist)
329   - {
330   - copy($ttFilePath.".tmp", $ttFilePath);
331   - unlink($ttFilePath.".tmp");
  480 + if ($intervals > 10000) {
  481 + set_time_limit(1800);
  482 + }
  483 +
  484 + $final = array();
  485 + for ($i = 0; $i < count($obj->ids); $i++) {
  486 + $final = array_merge($final, $interval[$i]);
  487 + }
  488 + sort($final);
  489 +
  490 + // Algorithm of union
  491 + $line = 0;
  492 + $i = 0;
  493 + $a = $final[$i][0];
  494 + while ($i < count($final) - 1) {
  495 + if ($final[$i + 1][1] <= $final[$i][1]) {
  496 + array_splice($final, $i + 1, 1);
  497 + } else {
  498 + if (($final[$i + 1][0] <= $final[$i][1]) && ($final[$i + 1][1] >= $final[$i][1])) {
  499 + $i++;
  500 + } else {
  501 + $start[$line] = $a;
  502 + $stop[$line] = $final[$i][1];
  503 + $i++;
  504 + $line++;
  505 + $a = $final[$i][0];
  506 + }
332 507 }
333   - return array ('error' => $e->getMessage());
334 508 }
  509 + $start[$line] = $a;
  510 + $stop[$line] = $final[$i][1];
  511 + $line++;
  512 +
  513 + $objTT = new stdClass();
  514 + $objTT->name = $obj->name;
  515 + $objTT->nodeType = 'timeTable';
  516 + $objTT->leaf = true;
  517 + $objTT->created = null;
  518 + $objTT->history = $obj->history;
  519 + for ($i = 0; $i < count($start); $i++) {
  520 + $inter = new stdClass();
  521 + $inter->start = $start[$i];
  522 + $inter->stop = $stop[$i];
  523 + $objTT->intervals[] = $inter;
  524 + }
  525 + $objTT->nbIntervals = count($start);
  526 + $this->objectDom = new DomDocument('1.0');
  527 + $this->objectDom->formatOutput = true;
  528 +
  529 + $res = $this->createParameter($objTT, $folder);
  530 + if ($res['error']) {
  531 + return $res;
  532 + }
  533 +
  534 + $this->saveIntervals($res['id'], $objTT->intervals, 'merge');
  535 +
  536 + return $res;
  537 +
335 538 }
336   -
337   - public function loadIntervalsFromTT($id,$typeTT,$start = NULL, $limit = NULL)
  539 +
  540 + public function loadIntervalsFromTT($id, $typeTT, $start = null, $limit = null)
338 541 {
339 542 if ($typeTT == 'sharedtimeTable') {
340 543 //Shared object
341 544 $sharedObjMgr = new SharedObjectsMgr();
342 545 $path = $sharedObjMgr->getDataFilePath('timeTable', $id);
  546 + } else {
  547 + $path = USERTTDIR . $id . '.xml';
343 548 }
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   -
  549 +
  550 + //load intervals from TT id
  551 + if (!file_exists($path)) {
  552 + return array('success' => false, 'message' => "Cannot find TT file " . $id);
  553 + }
  554 +
  555 + $this->objectDom->load($path);
  556 + if (!($objToGet = $this->objectDom->getElementById($id))) {
  557 + return array('success' => false, 'message' => NO_SUCH_ID . " " . $id);
  558 + }
  559 +
356 560 $xpath = new DOMXPath($this->objectDom);
357   - $intervals = $xpath->query('//intervals');
358   -
  561 + $intervals = $xpath->query('//intervals');
  562 +
359 563 $result = array();
360   -
  564 +
361 565 if (!isset($start) || !isset($limit)) {
362 566 foreach ($intervals as $interval) {
363 567 $startTime = $interval->getElementsByTagName('start')->item(0)->nodeValue;
364   - $stopTime = $interval->getElementsByTagName('stop')->item(0)->nodeValue;
  568 + $stopTime = $interval->getElementsByTagName('stop')->item(0)->nodeValue;
365 569 array_push($result, array('start' => $startTime, 'stop' => $stopTime));
366 570 }
367   - }
368   - else {
  571 + } else {
369 572 for ($i = 0; $i < $limit; ++$i) {
370   - if ($start+$i >= $intervals->length)
  573 + if ($start + $i >= $intervals->length) {
371 574 break;
372   - $startTime = $intervals->item($start+$i)->getElementsByTagName('start')->item(0)->nodeValue;
373   - $stopTime = $intervals->item($start+$i)->getElementsByTagName('stop')->item(0)->nodeValue;
  575 + }
  576 + $startTime = $intervals->item($start + $i)->getElementsByTagName('start')->item(0)->nodeValue;
  577 + $stopTime = $intervals->item($start + $i)->getElementsByTagName('stop')->item(0)->nodeValue;
374 578 array_push($result, array('start' => $startTime, 'stop' => $stopTime));
375 579 }
376 580 }
377   -
  581 +
378 582 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;
  583 + 'totalCount' => $intervals->length,
  584 + 'intervals' => $result,
  585 + 'start' => isset($start) ? $start : 0,
  586 + 'limit' => isset($limit) ? $limit : 0,
  587 + 'success' => true
  588 + );
393 589 }
394   -
395   - public function saveIntervals($id,$intervals,$action)
  590 +
  591 + public function saveIntervals($id, $intervals, $action)
396 592 {
397   - if (substr($id,0,6) == 'shared') {
  593 + if (substr($id, 0, 6) == 'shared') {
398 594 return array('success' => false, 'message' => "Cannot save shared TimeTable");
  595 + } else {
  596 + $path = USERTTDIR . $id . '.xml';
  597 + }
  598 + if (!file_exists($path)) {
  599 + return array('success' => false, 'message' => "Cannot find TT file " . $id);
  600 + }
  601 + $this->objectDom->load($path);
  602 +
  603 + if (!($objToGet = $this->objectDom->getElementById($id))) {
  604 + return array('success' => false, 'message' => NO_SUCH_ID . " " . $id);
399 605 }
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);
409 606  
410 607 //remove old intervals
411 608 $crtNode = $objToGet->firstChild;
412   -
  609 +
413 610 while ($crtNode) {
414   - if (($crtNode->nodeType != XML_ELEMENT_NODE) || ($crtNode->tagName != 'intervals')) {
  611 + if (($crtNode->nodeType != XML_ELEMENT_NODE) || ($crtNode->tagName != 'intervals')) {
415 612 $crtNode = $crtNode->nextSibling;
416 613 continue;
417 614 }
... ... @@ -420,357 +617,232 @@ class TimeTableMgr extends AmdaObjectMgr
420 617 $objToGet->removeChild($toRemove);
421 618 unset($toRemove);
422 619 }
423   -
  620 +
424 621 //add new intervals
425   - foreach ($intervals as $interval) {
426   - $newInterval = $this-> createIntervalElement($interval);
  622 + foreach ($intervals as $interval) {
  623 + $newInterval = $this->createIntervalElement($interval);
427 624 $this->objectDom->documentElement->appendChild($newInterval);
428 625 }
429 626  
430 627 //save modifications
431 628 $this->id = $id;
432   - $this->resFileName = USERTTDIR.$this->id.'.xml';
  629 + $this->resFileName = USERTTDIR . $this->id . '.xml';
433 630 $this->objectDom->save($this->resFileName);
434   -
  631 +
435 632 unset($this->objectDom);
436   -
437   - return array('success' => true,'action' => $action, 'nbIntervals' => count($intervals));
  633 +
  634 + return array('success' => true, 'action' => $action, 'nbIntervals' => count($intervals));
438 635 }
439   -
440   -
441   - public function getUploadedObject($name, $format, $onlyDescription = false)
  636 +
  637 + protected function createIntervalElement($interval)
442 638 {
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;
  639 + $newInterval = $this->objectDom->createElement('intervals');
  640 + $newInterval->appendChild($this->objectDom->createElement('start', $interval->start));
  641 + $newInterval->appendChild($this->objectDom->createElement('stop', $interval->stop));
  642 + return $newInterval;
  643 + }
  644 +
  645 + public function intersect($obj)
  646 + {
  647 +
  648 + for ($i = 0; $i < count($obj->ids); $i++) {
  649 + $table[$i] = $this->loadIntervalsFromTT($obj->ids[$i]);
  650 + for ($j = 0; $j < count($table[$i]['intervals']); $j++) {
  651 + $interval[$i][$j][0] = $table[$i]['intervals'][$j]['start'];
  652 + $interval[$i][$j][1] = $table[$i]['intervals'][$j]['stop'];
  653 + }
  654 + $intervals += count($interval[$i]);
449 655 }
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];
  656 + if ($intervals > 10000) {
  657 + set_time_limit(1800);
462 658 }
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 659  
472   - $attributes = $objToGet -> childNodes;
473   - $attributesToReturn['name'] = $name;
474   - $attributesToReturn['objName'] = $name;
475   - $attributesToReturn['objFormat'] = $format;
  660 + // Sort intervals in time tables
  661 + sort($interval[0]);
  662 + sort($interval[1]);
476 663  
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   - }
  664 + $i = 0;
  665 + $j = 0;
  666 + $line = 0;
  667 +
  668 + while (($i < count($interval[0])) && ($j < count($interval[1]))) {
  669 + $inter = $this->call_intersection($interval[0][$i], $interval[1][$j]);
  670 +
  671 + if ($inter[0][0] != 0 && $inter[0][1] != 0) {
  672 + $start[$line] = $inter[0][0];
  673 + $stop[$line] = $inter[0][1];
  674 + $line++;
  675 + }
  676 +
  677 + if ($interval[0][$i][1] < $interval[1][$j][1]) {
  678 + $i++;
  679 + } else {
  680 + $j++;
  681 + }
  682 + }
  683 +
  684 + // Intersection is empty
  685 + if ($line == 0) {
  686 + $result = "empty";
  687 + } else {
  688 + $objTT->name = $obj->name;
  689 + $objTT->nodeType = 'timeTable';
  690 + $objTT->leaf = true;
  691 + $objTT->created = null;
  692 + $objTT->history = $obj->history;
  693 + for ($i = 0; $i < count($start); $i++) {
  694 + $inter = new stdClass();
  695 + $inter->start = $start[$i];
  696 + $inter->stop = $stop[$i];
  697 + $objTT->intervals[] = $inter;
  698 + }
  699 + $objTT->nbIntervals = count($start);
  700 +
  701 + if (count($objTT->intervals) == 0) {
  702 + $result = "empty";
  703 + } else {
  704 + $this->objectDom = new DomDocument('1.0');
  705 + $this->objectDom->formatOutput = true;
  706 + $result = $this->createObject($objTT, $folder);
  707 +
  708 + if (!isset($result['error'])) {
  709 + $this->saveIntervals($result['id'], $objTT->intervals, 'intersect');
502 710 }
  711 +
503 712 }
504 713 }
505   - return $attributesToReturn;
  714 + return $result;
  715 + }
  716 +
  717 + protected function call_intersection($fst, $snd)
  718 + {
  719 + $inf = ($fst[0] > $snd[0]) ? $fst[0] : $snd[0];
  720 + $sup = ($fst[1] < $snd[1]) ? $fst[1] : $snd[1];
  721 + if ($inf >= $sup) {
  722 + $inter[] = array(0, 0);
  723 + } else {
  724 + $inter[] = array($inf, $sup);
  725 + }
  726 + return $inter;
506 727 }
507 728  
508 729 //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   - }
  730 +
  731 + function validNameObject($p)
  732 + {
  733 + // overwritten
  734 + $res = parent::validNameObject($p);
  735 +
  736 + if (!$res['valid']) {
  737 + return $res;
  738 + }
  739 +
  740 + //no space
  741 + if (strpos($p->name, ' ') === false) {
  742 + return array('valid' => true);
549 743 }
550   -
551   - return $attributesToReturn;
  744 +
  745 + return array('valid' => false, 'error' => 'Space character is not allowed');
552 746 }
553 747  
554 748 /*
555 749 * merge time tables
556 750 */
557   - public function merge($obj) {
558   - /**
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)
  751 +
  752 + public function copyTT($src_path, $dst_path, $newId, $newName, $newDescription = null)
720 753 {
721   - if (!file_exists($src_path))
722   - return FALSE;
723   -
724   - if (!is_dir($dst_path))
725   - return FALSE;
726   -
  754 + if (!file_exists($src_path)) {
  755 + return false;
  756 + }
  757 +
  758 + if (!is_dir($dst_path)) {
  759 + return false;
  760 + }
  761 +
727 762 $dom = new DomDocument('1.0');
728 763 $dom->formatOutput = true;
729   -
730   - if (!$dom->load($src_path))
731   - return FALSE;
732   -
  764 +
  765 + if (!$dom->load($src_path)) {
  766 + return false;
  767 + }
  768 +
733 769 $timeTableNodes = $dom->getElementsByTagName('timetable');
734   - if ($timeTableNodes->length <= 0)
735   - return FALSE;
736   -
  770 + if ($timeTableNodes->length <= 0) {
  771 + return false;
  772 + }
  773 +
737 774 $timeTableNode = $timeTableNodes->item(0);
738   -
  775 +
739 776 $timeTableNode->setAttribute('xml:id', $newId);
740   -
  777 +
741 778 $nameNodes = $timeTableNode->getElementsByTagName('name');
742   -
  779 +
743 780 if ($nameNodes->length <= 0) {
744 781 //create name node (normally never append)
745 782 $nameNode = $dom->createElement('name');
746 783 $timeTableNode->appendChild($nameNode);
747   - }
748   - else
  784 + } else {
749 785 $nameNode = $nameNodes->item(0);
750   -
  786 + }
  787 +
751 788 $nameNode->nodeValue = $newName;
752   -
  789 +
753 790 if (isset($newDescription) && !empty($newDescription)) {
754 791 $descriptionNodes = $timeTableNode->getElementsByTagName('description');
755 792 if ($descriptionNodes->length <= 0) {
756 793 //create description node (normally never append)
757 794 $descriptionNode = $dom->createElement('description');
758 795 $timeTableNode->appendChild($descriptionNode);
759   - }
760   - else
  796 + } else {
761 797 $descriptionNode = $descriptionNodes->item(0);
762   -
  798 + }
  799 +
763 800 $descriptionNode->nodeValue = $newDescription;
764 801 }
765   -
766   - $dst_file_path = $dst_path."/".$newId.".xml";
767   - if ($dom->save($dst_file_path) === FALSE)
768   - return FALSE;
769   -
  802 +
  803 + $dst_file_path = $dst_path . "/" . $newId . ".xml";
  804 + if ($dom->save($dst_file_path) === false) {
  805 + return false;
  806 + }
  807 +
770 808 chgrp($dst_file_path, APACHE_USER);
771 809 chmod($dst_file_path, 0775);
772   -
773   - return TRUE;
  810 +
  811 + return true;
  812 + }
  813 +
  814 + /*
  815 + * intersect time tables
  816 + */
  817 +
  818 + protected function renameInResource($name, $id)
  819 + {
  820 + if (!file_exists(USERTTDIR . $id . '.xml')) {
  821 + return false;
  822 + }
  823 +
  824 + $this->objectDom->load(USERTTDIR . $id . '.xml');
  825 + if (!($objToRename = $this->objectDom->getElementById($id))) {
  826 + return false;
  827 + }
  828 + $objToRename->getElementsByTagName('name')->item(0)->nodeValue = $name;
  829 + $this->objectDom->save(USERTTDIR . $id . '.xml');
  830 +
  831 + return true;
  832 + }
  833 +
  834 + protected function deleteParameter($id)
  835 + {
  836 + if (file_exists(USERTTDIR . $id . '.xml')) {
  837 + unlink(USERTTDIR . $id . '.xml');
  838 + }
  839 + }
  840 +
  841 + protected function renameOnly($p)
  842 + {
  843 + //if (!($p->intervals)) return true;
  844 + return false;
774 845 }
775 846 }
  847 +
776 848 ?>
... ...