ExecutableNode.js 4.77 KB
/** 
 * Project  : AMDA-NG4
 * Name     : ExecutableNode.js
 * @class   amdaModel.ExecutableNode
 * @extends amdaModel.InteractiveNode
 * @brief   Generic Model of Executable Node
 * @author  elena
 * @version $Id: ExecutableNode.js 1662 2013-07-02 15:10:22Z benjamin $
 */

Ext.define('amdaModel.ExecutableNode', {
	extend: 'amdaModel.InteractiveNode',
    
	fields: [ 'jobNode', 'resultModel' ],

	statics: { jobTreeLoaded : false },
    
	constructor : function(config) 
	{
		this.callParent(arguments);        
		this.set('ownerTreeId',amdaUI.ExplorerUI.OPE_TAB.TREE_ID);
		this.set('jobNode', 'amdaModel.BkgJobNode');		 
	},
    
	loadJobTree : function(opts) 
	{            
		var rootNode = Ext.getCmp(amdaUI.ExplorerUI.JOB_TAB.TREE_ID).getRootNode();	
		var me = this;
		amdaModel.InteractiveNode.preloadNodes(rootNode, function(){
			amdaModel.ExecutableNode.jobTreeLoaded = true;
			me.realExecute(opts); 
		});
	},   
   
	execute : function(opts) 
	{     
		if (!amdaModel.ExecutableNode.jobTreeLoaded) 
			this.loadJobTree(opts);
		else 
			this.realExecute(opts); 
	},
   
	/**
	* Method to execute this node 
	*/
	realExecute : function(opts) 
	{  
		var isInteractivePlot = (this.get('nodeType') == 'request') && (this.get('object').get('file-output') == 'INTERACTIVE') || (this.get('nodeType') == 'multiplot'); 

		var jsonObject = this.get('object').getJsonValues();
		if (opts && opts.sendToSamp) {
			jsonObject.sendToSamp = true;
			opts.clientId = opts.clientId ? opts.clientId : 'hub';
		}
       
		if (!loadMask.isMasked())
			loadMask.show(isInteractivePlot);
        
		AmdaAction.execute({nodeType : this.get('nodeType')}, jsonObject, 
			function(res,e)
			{    
				loadMask.hide();
	  
				//AKKA - Rework of the result treatment for the integration with the new kernel
				if (!e.status){
				//	myDesktopApp.errorMsg('Internal error during request');
					return;
				}

				if (!res.success){
					myDesktopApp.errorMsg(res.message);
					return;
				}
   
				if (res.killed)
						return;

				if (isInteractivePlot){
					myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.plot.id, true, function (module) {
						module.updateInteractiveSession(res, true);
					});
				}
				else if (!res.id && res.download) {
					//Download TT / Cat
					if (res.sendToSamp) {
						myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.interop.id, true, function (module) {
							Ext.Array.each(res.download, function(download) {
								module.sendVOTable(download, opts.clientId);
							});
						});
						return;
					} else if (res.compression) {					
						window.location.href = res.download;
					}
					else {
						window.open(res.download, '_blank');
					}
					return;
				}
				else {
					if (res.sendToSamp) {
						// Send to SAMP from Download UI
						var files = res.result.split(",");
						myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.interop.id, true, function (module) {
							Ext.each(files, function(file) {
								var href = 'data/'+sessionID+'/RES/'+ res.folder + '/' + file;
								module.sendVOTable(href, opts.clientId);
							});
						});
						return;
					}

					if (logExecTime && res.exectime && (res.exectime != 0)) {
						console.log("CMD EXEC TIME FOR "+res.id+" = "+res.exectime+"ms");
					}

					var newobj = this.createJobObject(res);	    
					var newNode = Ext.create(this.get('jobNode'), {
							info : res.info,
							jobType : this.get('nodeType'),
							processId : res.id,
							id : res.id,
							text : res.name,
							status : res.status,
							start : res.start,
							stop : res.stop,
							tabId : res.tabId,
							leaf : true,
							object : newobj
						});
     	    
					newNode.get('object').on('execute', function() {
							// Then call the node creation method
							this.execute(opts);
						}, newNode);
     	    
					switch (res.status)
					{
						case amdaModel.BkgJobNode.STATUS_LIST.DONE :
							newNode.createJobNode(true,res.start);
							newNode.editNode(true, false);
							break;
						case amdaModel.BkgJobNode.STATUS_LIST.IN_PROGRESS :
							newNode.createJobNode(false,res.start);
							break;
						default:
							newNode.createJobNode(true,res.start);
					}
				}
			}, this );
	},  

	createJobObject: function(res) 
	{      
		var obj =  this.get('object').getJsonValues();		    
		//TODO text, name, outputName - if all is needed 
		
		//new object to attach to new bkgJobNode	
		//TODO Ext.clone()  		     	  
		var newobj = Ext.copyTo({}, obj, this.get('object').propertiesToCopy);
		newobj.resultId = res.result;	
		newobj.folderId = res.folder;
		newobj.processId= res.id;
		newobj.tabId = res.tabId;
		newobj.name = res.name;
		newobj = Ext.create(this.get('object').$className, newobj);
		
		return   newobj;  
	},
	
	/**
	* override isExecutable to return true 
	*/
	isExecutable: function()
	{
		return true;
	}
});