Commit 42e2e019dbb600d7f98c916536b439b6340b4b60

Authored by Benjamin Renard
1 parent dd143fd0

Next step for cache rework

js/app/models/InteractiveNode.js
1   -/**
  1 +/**
2 2 * Project : AMDA-NG4
3 3 * Name : InteractiveNode.js
4 4 * @class amdaModel.InteractiveNode
... ... @@ -14,10 +14,10 @@ Ext.define('amdaModel.InteractiveNode', {
14 14 requires: [
15 15 'amdaPlotObj.PlotRequestObject'
16 16 ],
17   -
18   - fields: [
  17 +
  18 + fields: [
19 19 {name: 'contextNode', type: 'amdaModel.AmdaNode', persist: false},
20   - {name: 'objectDataModel', type: 'string', persist: false},
  20 + {name: 'objectDataModel', type: 'string', persist: false},
21 21 {name: 'object', type: 'object', persist: false},
22 22 {name: 'moduleId', type: 'string', persist: false},
23 23 {name: 'filtered', type: 'boolean', defaultValue: false, persist: false},
... ... @@ -28,7 +28,7 @@ Ext.define('amdaModel.InteractiveNode', {
28 28 statics: {
29 29 preloadNodes : function(node,onready)
30 30 {
31   - var me = this;
  31 + var me = this;
32 32 var nodesToLoad = new Array();
33 33 nodesToLoad.push(node);
34 34 this.preloadTreeNode(node, nodesToLoad, function (node)
... ... @@ -38,7 +38,7 @@ Ext.define('amdaModel.InteractiveNode', {
38 38 {
39 39 if (!element.isLoaded())
40 40 isFinish = false;
41   - });
  41 + });
42 42 if (isFinish && onready)
43 43 onready.call();
44 44 });
... ... @@ -47,29 +47,29 @@ Ext.define('amdaModel.InteractiveNode', {
47 47 preloadTreeNode : function(node, nodesToLoad, onloaded)
48 48 {
49 49 var me = this;
50   -
  50 +
51 51 if (node.isLoaded())
52 52 {
53 53 node.eachChild(function(n)
54   - {
  54 + {
55 55 if (!n.isLoaded() && !n.isRealLeaf())
56 56 {
57 57 nodesToLoad.push(n);
58 58 me.preloadTreeNode(n,nodesToLoad,onloaded);
59 59 }
60 60 });
61   -
  61 +
62 62 if (onloaded)
63 63 onloaded.call(me,node);
64 64 return;
65   - }
66   -
  65 + }
  66 +
67 67 node.store.load({
68   - node : node,
  68 + node : node,
69 69 callback : function(records, operation, successful)
70 70 {
71 71 records.forEach(function (record)
72   - {
  72 + {
73 73 if (!record.isLoaded() && !record.isRealLeaf())
74 74 {
75 75 nodesToLoad.push(record);
... ... @@ -82,21 +82,21 @@ Ext.define('amdaModel.InteractiveNode', {
82 82 });
83 83 }
84 84 },
85   -
  85 +
86 86 onReady : null,
87   -
  87 +
88 88 constructor : function(config)
89 89 {
90   - this.callParent(arguments);
91   - this.set('nodeType',this.self.nodeType);
  90 + this.callParent(arguments);
  91 + this.set('nodeType',this.self.nodeType);
92 92 this.set('ownerTreeId',amdaUI.ExplorerUI.RESRC_TAB.TREE_ID);
93 93 if (this.get('id')) { // TODO why sometimes (delete in remote interoper tree) this.get('id') = undefined ?
94   - // if id of this node have root category suffix
  94 + // if id of this node have root category suffix
95 95 if (Ext.util.Format.substr(this.get('id'), -(amdaUI.ExplorerUI.CAT_SUFFIX.length), this.get('id').length) === amdaUI.ExplorerUI.CAT_SUFFIX)
96 96 {
97 97 // set the expanded property to true
98 98 this.set('expanded',true);
99   - }
  99 + }
100 100 }
101 101 },
102 102  
... ... @@ -104,7 +104,7 @@ Ext.define('amdaModel.InteractiveNode', {
104 104 {
105 105 return this.isLeaf();
106 106 },
107   -
  107 +
108 108 /**
109 109 * this method is overriden into ExecutableNode to return true
110 110 */
... ... @@ -116,7 +116,7 @@ Ext.define('amdaModel.InteractiveNode', {
116 116 /**
117 117 * open Module with THIS NODE
118 118 */
119   - editInModule : function (contextNode, onReady)
  119 + editInModule : function (contextNode, onReady)
120 120 {
121 121 // set the contextNode of this node
122 122 this.set('contextNode',contextNode);
... ... @@ -124,50 +124,50 @@ Ext.define('amdaModel.InteractiveNode', {
124 124 var me = this;
125 125 myDesktopApp.getLoadedModule(this.get('moduleId'),true, function (module) {
126 126 // If the node to edit is not already linked to this module
127   - if (module.getLinkedNode() != me)
  127 + if (module.getLinkedNode() != me)
128 128 {
129 129 // set relative node into parameter Module
130   - module.setLinkedNode(me);
131   - if (contextNode==null)
  130 + module.setLinkedNode(me);
  131 + if (contextNode==null)
132 132 {
133 133 // set the root node as contextNode
134 134 contextNode = me.getRootNode();
135   - }
136   - module.setContextNode(contextNode);
137   -
  135 + }
  136 + module.setContextNode(contextNode);
  137 +
138 138 } else if (module.getLinkedNode() != null){
139 139 //TODO the node to edit is already edited
140 140 // myDesktopApp.warningMsg('This object is being edited');
141 141 //Sol1: msg alert: "warning this node is already edited! If you want to get the original, please press the 'reset' button"->'OK'
142 142 //Sol2: msg with user choice: "warning this node is already edited! Would you confirm this action and lost your modification?"->'Confirm','Cancel'
143 143 }
144   - // Opening parameter window
145   - module.createWindow(onReady);
146   - });
  144 + // Opening parameter window
  145 + module.createWindow(onReady);
  146 + });
147 147 },
148 148  
149 149 /**
150 150 * Method to rename the workspace node
151 151 */
152   - rename: function(value,callBackFn)
153   - {
  152 + rename: function(value,callBackFn)
  153 + {
154 154 var dataToSend = {id : this.get('id'), old_name: this.modified.text, name: value, parent : this.data.parentId, leaf: this.isRealLeaf(), nodeType: this.get('nodeType')};
155   - AmdaAction.renameObject(dataToSend, callBackFn);
  155 + AmdaAction.renameObject(dataToSend, callBackFn);
156 156 },
157   -
  157 +
158 158 /**
159 159 * Method to rename the workspace node when D&D
160 160 */
161   - renameDD: function(parentId, callBackFn)
162   - {
  161 + renameDD: function(parentId, callBackFn)
  162 + {
163 163 var dataToSend = {id : this.get('id'), old_name: this.get('name'), name: this.get('name'), parent : parentId, leaf: this.isRealLeaf(), nodeType: this.get('nodeType')};
164 164 AmdaAction.renameObject(dataToSend, callBackFn);
165 165 },
166   -
  166 +
167 167 /**
168 168 * validation method on name (used in module forms)
169 169 * @param name the name to validate
170   -* @returns
  170 +* @returns
171 171 */
172 172 isValidName : function(name, callBackFn)
173 173 {
... ... @@ -180,42 +180,42 @@ Ext.define('amdaModel.InteractiveNode', {
180 180 * node linked to a Module
181 181 */
182 182 update : function(opt)
183   - {
  183 + {
184 184 AmdaAction.modifyObject(this.get('object').getJsonValues(true), function(res,e){
185   -
  185 +
186 186 if(e.status) {
187   - if (res.id) {
  187 + if (res.id) {
188 188 if (!this.get('contextNode')) {
189 189 // set the root node of 'Derived Parameters' tree as contextNode
190 190 this.set('contextNode',this.getRootNode());
191 191 }
192 192 this.get('contextNode').expand(false,false);
193 193 this.myGetOwnerTree().getSelectionModel().select(this);
194   -
  194 +
195 195 if (opt)
196 196 {
197 197  
198 198 var scope = opt.scope ? opt.scope : this;
199 199 if (opt.callback)
200 200 opt.callback.call(scope,'update');
201   -
202   - }
203   - if(opt.notDisplayMsg){
204   - //do nothing
205   - }else{
206   - Ext.Msg.alert('Complete', 'Object '+this.get('object').get('name')+' has been modified');
207   - }
  201 + if(opt.notDisplayMsg){
  202 + //do nothing
  203 + }else{
  204 + Ext.Msg.alert('Complete', 'Object '+this.get('object').get('name')+' has been modified');
  205 + }
  206 +
  207 + }
208 208  
209 209 // fix the modifications for object
210 210 this.get('object').commit();
211   -
  211 +
212 212 if (res.info) {
213 213 this.set('info',res.info);
214 214 }
215   -
  215 +
216 216 // myDataParam and Parameter special update
217 217 this.specialUpdate(res, false);
218   -
  218 +
219 219 // reload object into the view of corresponding Module
220 220 var me = this;
221 221 myDesktopApp.getLoadedModule(this.get('moduleId'), true, function (module) {
... ... @@ -224,7 +224,7 @@ Ext.define('amdaModel.InteractiveNode', {
224 224 }
225 225 else {
226 226 //TODO proper error message handling
227   - // error code from server; but e.status==true
  227 + // error code from server; but e.status==true
228 228 // revert all modifications since last load or commit
229 229 this.get('object').reject();
230 230 myDesktopApp.errorMsg(res.error);
... ... @@ -233,7 +233,7 @@ Ext.define('amdaModel.InteractiveNode', {
233 233 else {
234 234 // revert all modifications since last load or commit
235 235 this.get('object').reject();
236   - myDesktopApp.errorMsg(e.message);
  236 + myDesktopApp.errorMsg(e.message);
237 237 }
238 238 },this);
239 239 },
... ... @@ -242,30 +242,30 @@ Ext.define('amdaModel.InteractiveNode', {
242 242 * Method to create a new AmdaObject by server side and create the workspace node linked to a Module
243 243 * under its contextNode or the root node corresponding to this nodeType category
244 244 */
245   - create : function(opt)
  245 + create : function(opt)
246 246 {
247 247 if (!this.get('contextNode') || (this.get('contextNode').data.id == 'sharedtimeTable-treeRootNode') || (this.get('contextNode').data.id == 'sharedcatalog-treeRootNode')) {
248 248 // set the root node of 'Derived Parameters' tree as contextNode
249 249 this.set('contextNode',this.getRootNode());
250   - }
251   - // call the Ext.Direct method to create parameter
252   - AmdaAction.createObject(this.get('object').getJsonValues(false), this.get('contextNode').get('id'), function(res,e){
  250 + }
  251 + // call the Ext.Direct method to create parameter
  252 + AmdaAction.createObject(this.get('object').getJsonValues(false), this.get('contextNode').get('id'), function(res,e){
253 253 //success
254   - if(e.status)
255   - {
  254 + if(e.status)
  255 + {
256 256 // if correct response received
257 257 if (res.id) { //if (res.id || res.error == 'NAME_EXISTS') {
258 258 // 'save as' case ; delete old node if it exists
259   - if (this.toRename)
  259 + if (this.toRename)
260 260 {
261   - this.toRename = false;
  261 + this.toRename = false;
262 262 var myRoot = this.getRootNode();
263 263 // search the same named node to override
264 264 var updateNode = myRoot.findChild('text',this.get('object').get('name'),true);
265 265 // destroy the overrided node
266 266 updateNode.parentNode.removeChild(updateNode);//TODO ??if destroy==true => too many recursions....
267   - updateNode.destroy();
268   - }
  267 + updateNode.destroy();
  268 + }
269 269 // set text of this node
270 270 this.set('text',this.get('object').get('name'));
271 271  
... ... @@ -274,52 +274,52 @@ Ext.define('amdaModel.InteractiveNode', {
274 274 this.internalId = res.id;
275 275  
276 276 // set id of node's object
277   - this.get('object').set('id',res.id);
  277 + this.get('object').set('id',res.id);
278 278 if (res.created){
279 279 // set the created date
280 280 this.get('object').set('created',res.created);
281 281 }
282   -
  282 +
283 283 if (res.info){
284 284 // set the tooltip
285 285 this.set('info',res.info);
286 286 }
287 287 //set globalStart & global Stop to be used for time selection
288 288 this.specialUpdate(res, true);
289   -
  289 +
290 290 //TODO do we need this commission ???
291 291 // fix the modifications for object
292   - this.get('object').commit();
  292 + this.get('object').commit();
293 293  
294 294 // if ownerTree panel is not active
295 295 if (this.myGetOwnerTree().ownerCt.getActiveTab()!==this.myGetOwnerTree()) {
296 296 // set ownerTree panel as the active tab - to enable selection of this node his ownerTree must have a view
297   - this.myGetOwnerTree().ownerCt.setActiveTab(this.myGetOwnerTree());
  297 + this.myGetOwnerTree().ownerCt.setActiveTab(this.myGetOwnerTree());
298 298 }
299 299 if(opt.notDisplayMsg){
300 300 //do nothing
301   - }else{
302   - Ext.Msg.alert('Complete', 'New object '+this.get('object').get('name')+' has been created');
  301 + }else{
  302 + Ext.Msg.alert('Complete', 'New object '+this.get('object').get('name')+' has been created');
303 303 }
304   -
  304 +
305 305 // expand the contextNode
306 306 this.get('contextNode').expand(false, function() {
307 307 if (!this.get('contextNode').findChild('text',this.get('text'))) {
308   - // create node in tree as child of contextNode
309   - this.get('contextNode').appendChild(this);
  308 + // create node in tree as child of contextNode
  309 + this.get('contextNode').appendChild(this);
310 310 }
311   - // select the new node
  311 + // select the new node
312 312 this.myGetOwnerTree().getSelectionModel().select(this);
313 313 if (opt) {
314 314 var scope = opt.scope ? opt.scope : this;
315 315 if (opt.callback)
316 316 opt.callback.call(scope,'create');
317   - }
  317 + }
318 318 }, this);
319   - }
  319 + }
320 320 // error code from server; but e.status==true
321 321 else {
322   - myDesktopApp.errorMsg(res.error);
  322 + myDesktopApp.errorMsg(res.error);
323 323 // revert all modifications since last load or commit
324 324 this.get('object').reject();
325 325 }
... ... @@ -331,14 +331,14 @@ Ext.define('amdaModel.InteractiveNode', {
331 331 //TODO: this.destroy();
332 332 myDesktopApp.errorMsg(e.message);
333 333 }
334   - },this);
  334 + },this);
335 335 },
336 336  
337 337 specialUpdate : function() {},
338 338 /**
339 339 * Generic part of Context Menu
340   -*
341   -*/
  340 +*
  341 +*/
342 342 allMenuItems : function() {
343 343 var src = this.self.objectName;
344 344 var menuItems =
... ... @@ -383,14 +383,14 @@ Ext.define('amdaModel.InteractiveNode', {
383 383 return menuMulti;
384 384 },
385 385  
386   - getAllContextMenuItems: function(){
387   - return this.allMenuItems();
  386 + getAllContextMenuItems: function(){
  387 + return this.allMenuItems();
388 388 },
389 389  
390 390 getMultiContextMenuItems: function(){
391 391 return this.allMenuMultiItems();
392 392 },
393   -
  393 +
394 394 /**
395 395 * default implementation
396 396 * no menu display if there's no override of this function
... ... @@ -398,99 +398,99 @@ Ext.define('amdaModel.InteractiveNode', {
398 398 getMultiContextMenuItems: function(){
399 399 return null;
400 400 },
401   -
  401 +
402 402 /**
403 403 * Context Menu Actions
404   -*
405   -*/
  404 +*
  405 +*/
406 406 onMenuItemClick : function(menu,item,event) {
407 407 // fnId parsing :
408 408 var fnId = Ext.util.Format.substr(item.fnId, 5, item.fnId.length);
409 409  
410 410 switch (fnId) {
411 411 case 'deleteNode':
412   - this.deleteNode();
  412 + this.deleteNode();
413 413 break;
414 414 case 'createDir':
415   - this.createDir();
  415 + this.createDir();
416 416 break;
417 417 case 'createLeaf':
418 418 this.createLeaf(this);
419   - break;
  419 + break;
420 420 case 'renameNode':
421 421 this.renameNode(false);
422 422 break;
423   - case 'editLeaf':
424   - this.editLeaf();
425   - break;
  423 + case 'editLeaf':
  424 + this.editLeaf();
  425 + break;
426 426 case 'deleteMulti':
427 427 this.deleteMulti();
428   - break;
429   - case 'plotParam':
430   - this.createPlot(this);
431 428 break;
432   - case 'downParam':
433   - this.createDownload(this);
434   - break;
  429 + case 'plotParam':
  430 + this.createPlot(this);
  431 + break;
  432 + case 'downParam':
  433 + this.createDownload(this);
  434 + break;
435 435 default:
436 436 break;
437 437 } // switch end
438 438 },
439   -
  439 +
440 440 getTimeFromNode: function(node) {
441 441 var startString = new String(node.get('globalStart'));
442 442 var stopString = new String(node.get('globalStop'));
443 443  
444   - var startDate = new Date(startString.replace(/\-/g,'\/').replace(/[T|Z]/g,' '));
  444 + var startDate = new Date(startString.replace(/\-/g,'\/').replace(/[T|Z]/g,' '));
445 445 var stopDate = new Date(stopString.replace(/\-/g,'\/').replace(/[T|Z]/g,' '));
446 446  
447 447 if (stopDate - startDate > 86400000 ) {
448   - var startTime = Ext.Date.add(stopDate, Ext.Date.DAY, -1);
  448 + var startTime = Ext.Date.add(stopDate, Ext.Date.DAY, -1);
449 449 // var timeObj = {start: Ext.Date.format(startTime, 'Y/m/d H:i:s'), stop: Ext.Date.format(stopDate, 'Y/m/d H:i:s')};
450 450 var timeObj = {start: Ext.Date.format(startTime, 'Y/m/d'), stop: Ext.Date.format(stopDate, 'Y/m/d')};
451   - }
  451 + }
452 452 else {
453 453 var timeObj = {start: node.get('globalStart'), stop: node.get('globalStop')};
454 454 }
455   - return timeObj;
  455 + return timeObj;
456 456 },
457 457  
458   - createPlot: function(node)
459   - {
460   - if (node.get('disable')) return;
  458 + createPlot: function(node)
  459 + {
  460 + if (node.get('disable')) return;
461 461 myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.plot.id, true, function (module) {
462   - if (!myDesktopApp.desktop.getWindow(myDesktopApp.dynamicModules.plot.id)) {
  462 + if (!myDesktopApp.desktop.getWindow(myDesktopApp.dynamicModules.plot.id)) {
463 463 var request = Ext.create(amdaPlotObj.PlotRequestObject.$className);
464   - var newNode = Ext.create(amdaModel.PlotNode.$className, { object : request });
  464 + var newNode = Ext.create(amdaModel.PlotNode.$className, { object : request });
465 465 // edit newNode into Plot Module with node as contextNode
466 466 newNode.editInModule();
467   - if((node.get('globalStart') != null) && (node.get('globalStop') != null) && node.get('globalStart') != 'depending on mission' && node.get('isParameter')) {
468   - module.getUiContent().setTimeFromData(node.getTimeFromNode(node));
  467 + if((node.get('globalStart') != null) && (node.get('globalStop') != null) && node.get('globalStart') != 'depending on mission' && node.get('isParameter')) {
  468 + module.getUiContent().setTimeFromData(node.getTimeFromNode(node));
469 469 }
470   - }
471   - module.getUiContent().addParameter(node);
  470 + }
  471 + module.getUiContent().addParameter(node);
472 472 });
473 473 },
474   -
475   - createDownload: function(node)
476   - {
  474 +
  475 + createDownload: function(node)
  476 + {
477 477 myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.download.id, true, function (module) {
478   - if (!myDesktopApp.desktop.getWindow(myDesktopApp.dynamicModules.download.id)) {
  478 + if (!myDesktopApp.desktop.getWindow(myDesktopApp.dynamicModules.download.id)) {
479 479 var request = Ext.create(amdaModel.Download.$className);
480   - amdaModel.DownloadNode.set('object',request);
  480 + amdaModel.DownloadNode.set('object',request);
481 481 // singleton!
482 482 amdaModel.DownloadNode.editInModule();
483 483 if ((node.get('globalStart') != null) && (node.get('globalStop') != null) && node.get('globalStart') != 'depending on mission' && node.get('isParameter')) {
484   - module.getUiContent().setTimeFromData(node.getTimeFromNode(node));
  484 + module.getUiContent().setTimeFromData(node.getTimeFromNode(node));
485 485 }
486   - }
487   - var paramName;
  486 + }
  487 + var paramName;
488 488 var components = null;
489 489 switch (node.$className) {
490   - case 'amdaModel.AliasNode' :
  490 + case 'amdaModel.AliasNode' :
491 491 paramName = "#"+node.get('text');
492 492 break;
493   - case 'amdaModel.DerivedParamComponentNode' :
  493 + case 'amdaModel.DerivedParamComponentNode' :
494 494 paramId = node.get('text');
495 495 var parentId = paramId.substr(0, paramId.length - 3);
496 496 paramName= "ws_" + parentId;
... ... @@ -502,18 +502,18 @@ Ext.define('amdaModel.InteractiveNode', {
502 502 components['index1'] = component_index[1];
503 503 }
504 504 break;
505   - case 'amdaModel.DerivedParamNode' :
  505 + case 'amdaModel.DerivedParamNode' :
506 506 paramName = "ws_"+node.get('text');
507 507 break;
508 508 case 'amdaModel.MyDataParamNode' :
509   - paramName = 'wsd_'+node.get('text');
510   - break;
511   - default :
  509 + paramName = 'wsd_'+node.get('text');
  510 + break;
  511 + default :
512 512 if (node.get('alias')!= "" )
513 513 paramName = "#"+node.get('alias');
514   - else
  514 + else
515 515 paramName = node.get('id');
516   - }
  516 + }
517 517 var component_info = node.get('component_info');
518 518 if (component_info && component_info.parentId) {
519 519 //It's a component
... ... @@ -523,23 +523,23 @@ Ext.define('amdaModel.InteractiveNode', {
523 523 components['index1'] = component_info.index1;
524 524 if (component_info.index2)
525 525 components['index2'] = component_info.index2;
526   - }
527   - module.addParam(paramName,true,node.get('needsArgs'),components);
528   - });
  526 + }
  527 + module.addParam(paramName,true,node.get('needsArgs'),components);
  528 + });
529 529 },
530   -
531   - deleteNode: function() {
  530 +
  531 + deleteNode: function() {
532 532 // if the target is a directory
533 533 if (!this.isRealLeaf()) {
534 534 // determine if this directory is empty before launching the delete confirmation method
535   - this.isNotEmptyDir(this.confirmDirectoryDeletion);
  535 + this.isNotEmptyDir(this.confirmDirectoryDeletion);
536 536 // else (the target is a leaf)
537 537 } else {
538 538 // no confirmation prompt for leaves
539 539 this.confirmDirectoryDeletion(false);
540 540 }
541 541 },
542   -
  542 +
543 543 /**
544 544 * this method return if node has Childs even if it was not already loaded
545 545 */
... ... @@ -547,21 +547,21 @@ Ext.define('amdaModel.InteractiveNode', {
547 547 var hasChilds;
548 548 // if node not already loaded
549 549 if (!this.isLoaded()){
550   - // call directFunction to load this node
  550 + // call directFunction to load this node
551 551 AmdaAction.getTree({node:this.get('id'),nodeType:this.get('nodeType')},function(res,e){
552 552 callbackFn.call(this,res.length>0?true:false);
553 553 },this);
554   - }
  554 + }
555 555 else {
556 556 callbackFn.call(this,this.hasChildNodes());
557 557 }
558 558 },
559   -
  559 +
560 560 /**
561 561 * this method is used to display a confirmation message
562 562 */
563 563 confirmDirectoryDeletion : function(isNotEmptyDir)
564   - {
  564 + {
565 565 // if this is a non-empty directory
566 566 if (isNotEmptyDir) {
567 567 // Prompt to the user if he also wants to delete its content
... ... @@ -571,28 +571,28 @@ Ext.define('amdaModel.InteractiveNode', {
571 571 this.realDelete();
572 572 }
573 573 },this);
574   - }
  574 + }
575 575 else {
576 576 this.realDelete();
577   - }
  577 + }
578 578 },
579   -
  579 +
580 580 /*
581 581 * Call the extDirect method to delete parameter
582   -* Callback method needed to execute node deletion in tree if id in result or to show error msg
  582 +* Callback method needed to execute node deletion in tree if id in result or to show error msg
583 583 */
584 584 realDelete : function()
585   - {
586   - AmdaAction.deleteObject({id: this.get('id'), leaf: this.isRealLeaf(), nodeType: this.get('nodeType')}, function(res,e){
587   - //TODO proper errors handling
588   - // node deletion in tree
  585 + {
  586 + AmdaAction.deleteObject({id: this.get('id'), leaf: this.isRealLeaf(), nodeType: this.get('nodeType')}, function(res,e){
  587 + //TODO proper errors handling
  588 + // node deletion in tree
589 589 if (res) { // if success
590 590 if (res.id) {
591 591 //Ext.Msg.show({title:'Warning', msg: 'Requests with parameter '+node.data.text+' are deleted', icon: Ext.MessageBox.ERROR, buttons: Ext.Msg.OK});
592 592 if (this.parentNode) {
593 593 if (this.isRealLeaf()){
594 594 var moduleId = this.get('moduleId');
595   - // if really interactive node
  595 + // if really interactive node
596 596 if (moduleId) {
597 597 var win = myDesktopApp.getDesktop().getWindow(moduleId);
598 598 // if window is really open
... ... @@ -600,72 +600,72 @@ Ext.define('amdaModel.InteractiveNode', {
600 600 var me = this;
601 601 myDesktopApp.getLoadedModule(moduleId, true, function (module) {
602 602 var editedNode = module.getLinkedNode();
603   -
604   - // file node is not linked directly to the module
  603 +
  604 + // file node is not linked directly to the module
605 605 var isThisFile = false;
606   - if (editedNode && editedNode.$className == 'amdaModel.MyDataParamNode')
  606 + if (editedNode && editedNode.$className == 'amdaModel.MyDataParamNode')
607 607 if (editedNode.get('fileObject').get('fileName') == me.get('text'))
608   - isThisFile = true;
609   -
610   - // node was created BEFORE tree loading; node.id are different ; but it is the same node
  608 + isThisFile = true;
  609 +
  610 + // node was created BEFORE tree loading; node.id are different ; but it is the same node
611 611 if ( editedNode && editedNode.get('id') == me.get('id') && editedNode !== me ) {
612 612 module.setLinkedNode(me);
613 613 isThisFile = true;
614 614 }
615   -
  615 +
616 616 if (me.$className == 'amdaModel.DerivedParamNode') {
617 617 var obj = {
618 618 paramId : 'ws_'+me.get('text')
619 619 };
620 620 AmdaAction.compilParamDelete(obj);
621 621 }
622   -
623   - if (editedNode === me || isThisFile ){
  622 +
  623 + if (editedNode === me || isThisFile ){
624 624 var newNode = Ext.ModelManager.create({leaf : true}, me.$className);
625 625 // several tabs could be connected to one node
626 626 if (moduleId === myDesktopApp.dynamicModules.plot.id) {
627 627 var linkedNodes = module.linkedNodes;
628   -
  628 +
629 629 if (linkedNodes) {
630   - linkedNodes.each(function(key, value){
631   - if (value === me) {
  630 + linkedNodes.each(function(key, value){
  631 + if (value === me) {
632 632 linkedNodes.replace(key,newNode);
633 633 var tabPanel = module.getUiContent().tabPanel.items.getByKey(key);
634   - tabPanel.setObject(Ext.create(amdaModel.Plot.$className, {}));
635   - }
  634 + tabPanel.setObject(Ext.create(amdaModel.Plot.$className, {}));
  635 + }
636 636 }, me);
637   - }
638   - }
  637 + }
  638 + }
639 639 newNode.editInModule();
640 640 }
641   - });
  641 + });
642 642 }
643 643 }
644   - }
645   - //update mask info in myData
  644 + }
  645 + //update mask info in myData
646 646 if (res.maskDesc && !res.maskDeleted) {
647 647 this.parentNode.set('info', res.maskDesc);
648 648 this.updateMyDataParam(res.mask, res.maskDesc);
649   - }
650   - this.remove();
  649 + }
  650 + this.remove();
651 651 }
652   - //TODO Several special node-dependent actions - to move to node functions..
653   - // nodes of another nodeType to be deleted as they depend on deleted node
  652 + //TODO Several special node-dependent actions - to move to node functions..
  653 + // nodes of another nodeType to be deleted as they depend on deleted node
654 654 if (res.params) {
655 655 this.deleteDependence(res.params);
656 656 //TODO reset
657   - }
658   - // mask was deleted or updated - to update mydata tree
  657 + }
  658 + // mask was deleted or updated - to update mydata tree
659 659 if (res.maskDeleted) {
660   - this.updateMyData();
661   - }
  660 + this.updateMyData();
  661 + }
662 662 }
663 663 else {
664   - myDesktopApp.warningMsg(res.error);
  664 + myDesktopApp.warningMsg(res.error);
665 665 }
666 666 }
667 667 else {
668   - myDesktopApp.errorMsg(e.message);
  668 + myDesktopApp.errorMsg(e.message);
669 669 }
670 670 }, this);
671 671 },
... ... @@ -681,7 +681,7 @@ Ext.define('amdaModel.InteractiveNode', {
681 681 item.deleteNode();
682 682 })
683 683 },
684   -
  684 +
685 685 /*
686 686 * Create Folder
687 687 */
... ... @@ -710,9 +710,9 @@ Ext.define('amdaModel.InteractiveNode', {
710 710 newNode.renameNode(true);
711 711 });
712 712 },
713   -
  713 +
714 714 /*
715   -*
  715 +*
716 716 */
717 717 createLeaf: function(contextNode) {
718 718 // create new node with the same type than the contextNode
... ... @@ -730,7 +730,7 @@ Ext.define('amdaModel.InteractiveNode', {
730 730 renameNode: function(deleteOnFailure)
731 731 {
732 732 if (this.myGetOwnerTree())
733   - {
  733 + {
734 734 // load the rootNode and recursively all its child nodes if not already loaded
735 735 var me = this;
736 736 amdaModel.InteractiveNode.preloadNodes(this.getRootNode(),
... ... @@ -752,48 +752,48 @@ Ext.define('amdaModel.InteractiveNode', {
752 752 * load the rootNode and recursively all its child nodes
753 753 * to know all names of DerivedParameters
754 754 */
755   - editLeaf: function(onReady)
756   - {
  755 + editLeaf: function(onReady)
  756 + {
757 757 var me = this;
758 758 amdaModel.InteractiveNode.preloadNodes(this.getRootNode(),
759 759 function()
760 760 {
761   - if (me.get('object'))
  761 + if (me.get('object'))
762 762 {
763 763 // launch edition of parameter into parameter module
764 764 me.editInModule(null, onReady);
765 765 }
766 766 else
767   - {
  767 + {
768 768 // call the ext method to get the details of parameter
769   - // the edition of real parameter is done into callback method getObjectCallback
770   - if (onReady)
  769 + // the edition of real parameter is done into callback method getObjectCallback
  770 + if (onReady)
771 771 me.onReady = onReady;
772   -
  772 +
773 773 AmdaAction.getObject(me.get('id'), me.get('nodeType'), me.getObjectCallback, me);
774 774 }
775   - });
  775 + });
776 776 },
777 777  
778 778 /*
779   -*
  779 +*
780 780 */
781 781 getObjectCallback : function(result,remoteEvent)
782 782 {
783 783 var t = remoteEvent.getTransaction();
784   -
785   - if (result) {
  784 +
  785 + if (result) {
786 786 var paramObj = Ext.create(this.get('objectDataModel'), result);
787 787 // set parameter into node
788 788 this.set('object',paramObj);
789   - // Edition of parameter into parameter Module
  789 + // Edition of parameter into parameter Module
790 790 this.editInModule(null, this.onReady);
791 791 this.onReady = null;
792   - }
  792 + }
793 793 else {
794 794 // EXCEPTION : parameter not found !?
795 795 myDesktopApp.errorMsg(t.action + "." + t.method + " : No parameter '"
796   - + this.get('name') + "' found!");
  796 + + this.get('name') + "' found!");
797 797 }
798   - }
  798 + }
799 799 });
... ...
js/app/views/CatalogUI.js
... ... @@ -672,7 +672,7 @@ Ext.define('amdaUI.CatalogUI', {
672 672 'isCatalog' : true,
673 673 'data' : {}
674 674 };
675   - obj['data']['activeColumn.dataIndex'] = value;
  675 + obj['data'][activeColumn.dataIndex] = value;
676 676  
677 677 //Interval is modified on the server side
678 678 me.editing = true;
... ...
php/TTCacheDump.php
1 1 <?php
2   -/*define ("USERWSDIR", "/home/amda_admin/AMDA-GIT/AMDA_IHM/data/testKernel/WS/");
3   -define ("USERTTDIR", "/home/amda_admin/AMDA-GIT/AMDA_IHM/data/testKernel/TT/");
4   -
5   -require_once("classes/AmdaObjectMgr.php");
6   -require_once("classes/TimeTableMgr.php");
7   -require_once("classes/CatalogMgr.php");
8   -require_once("classes/TimeTableCacheMgr.php");
9   -require_once("classes/TimeTableCacheObject.php");
10   -require_once("classes/IntervalCacheObject.php");
11   -require_once("classes/CatalogCacheMgr.php");
12   -*/
13 2  
14 3 require_once("config.php");
15 4  
... ... @@ -17,6 +6,7 @@ define (&quot;USERWSDIR&quot;, &quot;/home/amda_admin/AMDA-GIT/AMDA_IHM/data/testKernel/WS/&quot;);
17 6 define ("USERTTDIR", "/home/amda_admin/AMDA-GIT/AMDA_IHM/data/testKernel/TT/");
18 7  
19 8 $cacheMgr = new CatalogCacheMgr();
  9 +#$cacheMgr = new TimeTableCacheMgr();
20 10  
21 11 $cacheMgr->dump();
22 12  
... ...
php/classes/AmdaAction.php
... ... @@ -654,20 +654,51 @@ class AmdaAction
654 654 $fileContent = preg_replace(['~\R~u', "/\t/"], ["\n", ' '], trim(file_get_contents(USERTEMPDIR . $name)));
655 655 file_put_contents(USERTEMPDIR . $name, $fileContent);
656 656  
  657 + $isTTCat = FALSE;
657 658 switch ($nodeType)
658 659 {
659 660 case 'timeTable' :
660 661 $objectMgr = new TimeTableMgr();
  662 + $isTTCat = TRUE;
661 663 break;
662 664 case 'myDataParam' :
663 665 $objectMgr = new FilesMgr();
664 666 break;
665 667 case 'catalog' :
666 668 $objectMgr = new CatalogMgr();
  669 + $isTTCat = TRUE;
667 670 break;
668 671 default:
669 672 return array("error" => $nodeType." NOT_IMPLEMENTED_YET");
670 673 }
  674 + if ($isTTCat) {
  675 + //Pre-process: convert to INTERNAL format if needed
  676 + if (($format == 'ASCII') || ($format == 'VOT')) {
  677 + $result = $this->executeRequest((Object) array(
  678 + 'compression' => 'none',
  679 + 'fileformat' => 'internal',
  680 + 'sendToSamp' => FALSE,
  681 + 'list' => array(
  682 + (Object) array(
  683 + 'path' => USERTEMPDIR . $name,
  684 + 'format' => $format,
  685 + 'name' => pathinfo($name, PATHINFO_FILENAME),
  686 + )
  687 + ),
  688 + ), FunctionTypeEnumClass::TTCONVERT);
  689 + if (!$result['success']) {
  690 + return array("error" => "Error during file conversion");
  691 + }
  692 + $name = basename($result['download']);
  693 + $convertedFile = USERDIR.'/DOWNLOAD.TEMP/'.$name;
  694 + if (!file_exists($convertedFile)) {
  695 + return array("error" => "Error during file conversion");
  696 + }
  697 +
  698 + $format = 'internal';
  699 + rename($convertedFile, USERTEMPDIR . '/' . $name);
  700 + }
  701 + }
671 702 return $objectMgr->getUploadedObject($name, $format, true);
672 703 }
673 704  
... ... @@ -1117,7 +1148,6 @@ class AmdaAction
1117 1148 {
1118 1149 if (!$isCatalog) $cacheMgr = new TimeTableCacheMgr();
1119 1150 else $cacheMgr = new CatalogCacheMgr();
1120   -
1121 1151 return $cacheMgr->initFromUploadedFile($name, $format);
1122 1152 }
1123 1153  
... ... @@ -1192,7 +1222,6 @@ class AmdaAction
1192 1222  
1193 1223 public function getTTCacheStatistics($obj)
1194 1224 {
1195   - error_log("name",$obj->name );
1196 1225 if($obj->name == "timeTableUi"){
1197 1226 $cacheMgr = new TimeTableCacheMgr();
1198 1227 }elseif($obj->name == "catalogUI"){
... ...
php/classes/CatalogCacheIntervalObject.php
... ... @@ -27,6 +27,17 @@ class CatalogCacheIntervalObject extends TimeTableCacheIntervalObject
27 27 return $this->params;
28 28 }
29 29  
  30 + public function modifyInterval($data) {
  31 + parent::modifyInterval($data);
  32 + foreach ($this->cacheObject->getParametersInfo() as $parameter) {
  33 + if (array_key_exists($parameter['id'], $data)) {
  34 + $this->setParamValue($parameter['id'], $data->{$parameter['id']});
  35 + $this->setIsModified(true);
  36 + }
  37 + }
  38 + return $this->isModified();
  39 + }
  40 +
30 41 public function writeBin($handle)
31 42 {
32 43 parent::writeBin($handle);
... ...
php/classes/CatalogCacheMgr.php
... ... @@ -42,31 +42,14 @@ class CatalogCacheMgr extends TimeTableCacheMgr
42 42 return array('parameters' => $this->cache->getParametersInfo());
43 43 }
44 44  
45   - protected function loadAdditionalDescription($id, $type) {
46   - $params_desc = $this->objectMgr->getCatalogParamDescription($id, "", FALSE, $type);
  45 + protected function loadAdditionalDescription($options) {
  46 + $params_desc = $this->objectMgr->getCatalogParamDescription($options);
47 47 if (!$params_desc['success']) {
48 48 return array();
49 49 }
50 50 return array('parameters' => $params_desc['parameters']);
51 51 }
52 52  
53   - public function initFromTmpObject($folderId, $name) {
54   - $result = parent::initFromTmpObject($folderId, $name);
55   - if (!$result['success']) {
56   - return $result;
57   - }
58   -
59   - $params_desc = $this->objectMgr->getCatalogParamDescription($id, $name, FALSE, $type);
60   - if (!$params_desc['success']) {
61   - return $params_desc;
62   - }
63   -
64   - foreach ($params_desc['parameters'] as $parameter) {
65   - $this->cache->addParameter($parameter['id'], $parameter['name'], intval($parameter['size']), intval($parameter['type']));
66   - }
67   -
68   - return $result+ array('parameters' => $this->cache->getParametersInfo());
69   - }
70 53  
71 54 public function initFromUploadedFile($name, $format)
72 55 {
... ...
php/classes/CatalogCacheObject.php
... ... @@ -121,16 +121,11 @@ class CatalogCacheObject extends TimeTableCacheObject
121 121 if ($interval->getId() == $cacheId)
122 122 {
123 123 foreach($data as $key => $value) {
124   - if (strpos($key, 'param') !== FALSE) {
125   - $params = $interval->getParams();
126   - $paramIndex = (int)substr($key,5);
127   - $params[$paramIndex-2] = $value;
128   - $interval->setParams($params);
129   - $interval->setIsModified(true);
130   - $this->isModified = true;
131   - }
  124 + $interval->setParamValue($key, $value);
  125 + $interval->setIsModified(true);
  126 + $this->isModified = true;
132 127 }
133   - return true;
  128 + return $this->isModified;
134 129 }
135 130 }
136 131  
... ...
php/classes/CatalogMgr.php
... ... @@ -209,15 +209,15 @@ class CatalogMgr extends TimeTableMgr
209 209 return $paramsElement;
210 210 }
211 211  
212   - protected function createIntervalElement($interval)
  212 + protected function createIntervalElement($interval, $options = array())
213 213 {
214 214 $newInterval = $this->objectDom->createElement('intervals');
215 215 $newInterval->appendChild($this->objectDom->createElement('start',$interval['start']));
216 216 $newInterval->appendChild($this->objectDom->createElement('stop',$interval['stop']));
217   - foreach ($interval as $key =>$value) {
218   - if (substr($key,0,5) == 'param')
219   - $newInterval->appendChild($this->objectDom->createElement('param', $value));
220   -
  217 + if (!empty($options['parameters'])) {
  218 + foreach ($options['parameters'] as $parameter) {
  219 + $newInterval->appendChild($this->objectDom->createElement('param', $interval[$parameter['id']]));
  220 + }
221 221 }
222 222 return $newInterval;
223 223 }
... ... @@ -325,36 +325,34 @@ class CatalogMgr extends TimeTableMgr
325 325  
326 326 }
327 327  
328   - public function getCatalogParamDescription($id, $name, $isTmpObject, $type)
  328 + public function getCatalogParamDescription($options)
329 329 {
330   - if ($type == 'sharedcatalog') {
  330 + if (isset($options['type']) && ($options['type'] == 'sharedcatalog')) {
331 331 //Shared object
332 332 $sharedObjMgr = new SharedObjectsMgr();
333   - $path = $sharedObjMgr->getDataFilePath('catalog', $id);
  333 + $path = $sharedObjMgr->getDataFilePath('catalog', $options['id']);
334 334 }
335   - elseif (!$isTmpObject) {
336   - $path = USERTTDIR.$id.'.xml';
  335 + elseif (!isset($options['isTmpObject']) || !$options['isTmpObject']) {
  336 + $path = USERTTDIR.$options['id'].'.xml';
337 337 }
338 338 else {
339   - $path = USERWORKINGDIR.$id.'/'.$name.'.xml';
  339 + $path = $options['folder'].'/'.$options['name'].'.xml';
340 340 }
341 341  
342 342 //load intervals from Catalog id
343 343 if (!file_exists($path))
344   - return array('success' => false, 'message' => "Cannot find Catalog file ".$id);
  344 + return array('success' => false, 'message' => "Cannot find Catalog file ".$path);
345 345  
346 346 if (!$this->objectDom->load($path))
347   - return array('success' => false, 'message' => "Cannot load Catalog file ".$id);
  347 + return array('success' => false, 'message' => "Cannot load Catalog file");
348 348  
349   -// if (!($objToGet = $this->objectDom->getElementById($id)))
350   -// return array('success' => false, 'message' => NO_SUCH_ID." ".$id);
351 349  
352 350 $nameNodes = $this->objectDom->getElementsByTagName('name');
353 351  
354 352 if ($nameNodes->length > 0)
355 353 $nameReal = $nameNodes->item(0)->nodeValue;
356 354 else
357   - $nameReal = $name;
  355 + $nameReal = $options['name'];
358 356  
359 357 $xpath = new DOMXPath($this->objectDom);
360 358 $intervals = $xpath->query('//intervals');
... ...
php/classes/TimeTableCacheIntervalObject.php
... ... @@ -93,7 +93,18 @@ class TimeTableCacheIntervalObject
93 93 return $result;
94 94 }
95 95  
  96 + public function modifyInterval($data) {
  97 + if (array_key_exists('start', $data)) {
  98 + $this->setStartFromISO($data->{'start'});
  99 + $this->setIsModified(true);
  100 + }
  101 + if (array_key_exists('stop', $data)) {
  102 + $this->setStopFromISO($data->{'stop'});
  103 + $this->setIsModified(true);
  104 + }
96 105  
  106 + return $this->isModified();
  107 + }
97 108  
98 109 public function writeBin($handle) {
99 110 fwrite($handle,pack('L6',$this->id,$this->index,$this->start,$this->stop,$this->isNew,$this->isModified));
... ... @@ -110,7 +121,7 @@ class TimeTableCacheIntervalObject
110 121 }
111 122  
112 123 public function dump() {
113   - echo " => Interval : id = ".$this->id.", index = ".$this->index.", start = ".$this->start.", stop = ".$this->stop.", isNew = ".$this->isNew.", isModified = ".$this->isModified.PHP_EOL;
  124 + echo " => Interval : id = ".$this->id.", index = ".$this->index.", start = ".TimeUtils::stamp2iso($this->start).", stop = ".TimeUtils::stamp2iso($this->stop).", isNew = ".$this->isNew.", isModified = ".$this->isModified.PHP_EOL;
114 125 }
115 126 }
116 127 ?>
... ...
php/classes/TimeTableCacheMgr.php
... ... @@ -26,7 +26,7 @@
26 26 return array();
27 27 }
28 28  
29   - protected function loadAdditionalDescription($id, $type) {
  29 + protected function loadAdditionalDescription($options) {
30 30 return array();
31 31 }
32 32  
... ... @@ -39,7 +39,7 @@
39 39 }
40 40  
41 41 public function initFromObject($id, $type) {
42   - $options = $this->loadAdditionalDescription($id, $type);
  42 + $options = $this->loadAdditionalDescription(array('id' => $id, 'type' => $type, 'isTmpObject' => FALSE));
43 43 //Create new cache
44 44 $info = $this->resetCache($options);
45 45  
... ... @@ -92,8 +92,9 @@
92 92  
93 93  
94 94 public function initFromTmpObject($folderId, $name) {
  95 + $options = $this->loadAdditionalDescription(array('folder' => USERWORKINGDIR.$folderId, 'name' => $name, 'isTmpObject' => TRUE));
95 96 //Create new cache
96   - $this->resetCache();
  97 + $info = $this->resetCache($options);
97 98  
98 99 //Load intervals from TmpObject file (DD_Search output)
99 100 $intervals_res = $this->objectMgr->getTmpObject($folderId, $name);
... ... @@ -118,12 +119,13 @@
118 119 $this->cache->updateIndexes();
119 120  
120 121 //Save cache file
121   - return array('success' => $this->saveToFile(), 'token' => $this->cache->getToken(), 'status' => $this->cache->getStatus());
  122 + return array('success' => $this->saveToFile(), 'token' => $this->cache->getToken(), 'status' => $this->cache->getStatus()) + $info;
122 123 }
123 124  
124 125 public function initFromUploadedFile($name, $format) {
  126 + $options = $this->loadAdditionalDescription(array('folder' => USERTEMPDIR, 'name' => $name, 'isTmpObject' => TRUE));
125 127 //Create new cache
126   - $this->resetCache();
  128 + $info = $this->resetCache($options);
127 129  
128 130 //Load intervals from uploaded file
129 131 $intervals_res = $this->objectMgr->getUploadedObject($name, $format);
... ... @@ -148,7 +150,7 @@
148 150 $this->cache->updateIndexes();
149 151  
150 152 //Save cache file
151   - return array('success' => $this->saveToFile(), 'token' => $this->cache->getToken(), 'status' => $this->cache->getStatus());
  153 + return array('success' => $this->saveToFile(), 'token' => $this->cache->getToken(), 'status' => $this->cache->getStatus()) + $info;
152 154 }
153 155  
154 156 public function saveInObject($id, $action, $token) {
... ... @@ -165,7 +167,9 @@
165 167  
166 168 $this->cache->reset();
167 169  
168   - return $this->objectMgr->saveIntervals($id, $intervals, $action);
  170 + $options = $this->loadAdditionalDescription(array('id' => $id));
  171 +
  172 + return $this->objectMgr->saveIntervals($id, $intervals, $action, $options);
169 173 }
170 174  
171 175 public function getIntervals($start,$limit,$sort_obj,$filter_json) {
... ...
php/classes/TimeTableCacheObject.php
... ... @@ -93,20 +93,7 @@ class TimeTableCacheObject
93 93 {
94 94 if ($interval->getId() == $cacheId)
95 95 {
96   - foreach ($data as $key => $value) {
97   - switch ($key) {
98   - case 'start' :
99   - $interval->setStartFromISO($value);
100   - $interval->setIsModified(true);
101   - $this->isModified = true;
102   - break;
103   - case 'stop':
104   - $interval->setStopFromISO($value);
105   - $interval->setIsModified(true);
106   - $this->isModified = true;
107   - break;
108   - }
109   - }
  96 + $this->isModified = $interval->modifyInterval($data);
110 97 return $this->isModified;
111 98 }
112 99 }
... ...
php/classes/TimeTableMgr.php
... ... @@ -511,7 +511,7 @@ class TimeTableMgr extends AmdaObjectMgr
511 511 * @param $action
512 512 * @return array
513 513 */
514   - public function saveIntervals($id, $intervals, $action)
  514 + public function saveIntervals($id, $intervals, $action, $options = array())
515 515 {
516 516 if (substr($id, 0, 6) == 'shared') {
517 517 return ['success' => false, 'message' => "Cannot save shared TimeTable"];
... ... @@ -543,7 +543,7 @@ class TimeTableMgr extends AmdaObjectMgr
543 543  
544 544 //add new intervals
545 545 foreach ($intervals as $interval) {
546   - $newInterval = $this->createIntervalElement($interval);
  546 + $newInterval = $this->createIntervalElement($interval, $options);
547 547 $this->objectDom->documentElement->appendChild($newInterval);
548 548 }
549 549  
... ... @@ -562,11 +562,11 @@ class TimeTableMgr extends AmdaObjectMgr
562 562 * @param $interval
563 563 * @return DOMElement
564 564 */
565   - protected function createIntervalElement($interval)
  565 + protected function createIntervalElement($interval, $options = array())
566 566 {
567 567 $newInterval = $this->objectDom->createElement('intervals');
568   - $newInterval->appendChild($this->objectDom->createElement('start', $interval->start));
569   - $newInterval->appendChild($this->objectDom->createElement('stop', $interval->stop));
  568 + $newInterval->appendChild($this->objectDom->createElement('start', $interval['start']));
  569 + $newInterval->appendChild($this->objectDom->createElement('stop', $interval['stop']));
570 570 return $newInterval;
571 571 }
572 572  
... ...