Repository: ambari
Updated Branches:
  refs/heads/trunk f7472a09a -> 135c0cbfb


AMBARI-20293. WFM FS editor needs to maintain order of FS operations. (Belliraj 
HB via gauravn7)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/135c0cbf
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/135c0cbf
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/135c0cbf

Branch: refs/heads/trunk
Commit: 135c0cbfbe7eb976926f8b30db36493bca94fa1c
Parents: f7472a0
Author: Gaurav Nagar <grv...@gmail.com>
Authored: Fri Mar 3 21:07:06 2017 +0530
Committer: Gaurav Nagar <grv...@gmail.com>
Committed: Fri Mar 3 21:07:35 2017 +0530

----------------------------------------------------------------------
 .../ui/app/domain/actionjob_hanlder.js          | 330 +++++++++----------
 .../resources/ui/app/domain/node-handler.js     |   4 +-
 .../ui/app/domain/workflow-importer.js          |  10 +-
 .../ui/app/domain/workflow-xml-generator.js     |   2 +-
 4 files changed, 172 insertions(+), 174 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/135c0cbf/contrib/views/wfmanager/src/main/resources/ui/app/domain/actionjob_hanlder.js
----------------------------------------------------------------------
diff --git 
a/contrib/views/wfmanager/src/main/resources/ui/app/domain/actionjob_hanlder.js 
b/contrib/views/wfmanager/src/main/resources/ui/app/domain/actionjob_hanlder.js
index 3058610..c9dc751 100644
--- 
a/contrib/views/wfmanager/src/main/resources/ui/app/domain/actionjob_hanlder.js
+++ 
b/contrib/views/wfmanager/src/main/resources/ui/app/domain/actionjob_hanlder.js
@@ -356,10 +356,10 @@ var CustomActionJobHandler=ActionJobHandler.extend({
     nodeObj[this.get("actionType")] = customDomain;
   }
 });
-
 var FSActionJobHandler=ActionJobHandler.extend({
   actionType:"fs",
   mapping:null,
+  x2js : new X2JS({escapeMode:false}),
   init(){
     this.mapping=[
       {xml:"name-node",domain:"nameNode"},
@@ -368,7 +368,7 @@ var FSActionJobHandler=ActionJobHandler.extend({
       {xml:"delete"},
       {xml:"mkdir"},
       {xml:"move"},
-         {xml:"chmod"},
+           {xml:"chmod"},
       {xml:"touchz"},
       {xml:"chgrp"}
     ];
@@ -378,192 +378,186 @@ var FSActionJobHandler=ActionJobHandler.extend({
     if (!nodeDomain.fsOps){
       return;
     }
+    var $root = Ember.$('<XMLDocument />');
     nodeDomain.fsOps.forEach(function(fsop){
-      if (!nodeObj.fs[fsop.type]){
-        nodeObj.fs[fsop.type]=[];
-      }
       switch (fsop.type) {
-        case "delete":
-        nodeObj.fs["delete"].push({"_path":fsop.path});
-        break;
-        case "mkdir":
-        nodeObj.fs["mkdir"].push({"_path":fsop.path});
-        break;
-        case "move":
-        nodeObj.fs["move"].push({"_source":fsop.source,"_target":fsop.target});
-        break;
-        case "touchz":
-        nodeObj.fs["touchz"].push({"_path":fsop.path});
-        break;
-        case "chmod":
-        var permissions, ownerPerm = 0, groupPerm = 0, othersPerm = 0, 
dirFiles = fsop.dirfiles;
+        case 'delete':
+          $root.append(Ember.$('<delete/>').attr("path",fsop.path));
+          break;
+        case 'mkdir':
+          $root.append(Ember.$('<mkdir/>').attr("path",fsop.path));
+          break;
+        case 'move':
+          
$root.append(Ember.$('<move/>').attr("source",fsop.source).attr("target",fsop.target));
+          break;
+        case 'touchz':
+          $root.append(Ember.$('<touchz/>').attr("path",fsop.path));
+          break;
+        case 'chmod':
+          var permissions, ownerPerm = 0, groupPerm = 0, othersPerm = 0, 
dirFiles = fsop.dirfiles;
 
-        if(fsop){
-          if(fsop.oread){
-            ownerPerm = 1;
-          }
-          if(fsop.owrite){
-            ownerPerm = ownerPerm + 2;
-          }
-          if(fsop.oexecute){
-            ownerPerm = ownerPerm + 4;
-          }
-          if(fsop.gread){
-            groupPerm = 1;
-          }
-          if(fsop.gwrite){
-            groupPerm = groupPerm + 2;
+          if(fsop){
+            if(fsop.oread){
+              ownerPerm = 1;
+            }
+            if(fsop.owrite){
+              ownerPerm = ownerPerm + 2;
+            }
+            if(fsop.oexecute){
+              ownerPerm = ownerPerm + 4;
+            }
+            if(fsop.gread){
+              groupPerm = 1;
+            }
+            if(fsop.gwrite){
+              groupPerm = groupPerm + 2;
+            }
+            if(fsop.gexecute){
+              groupPerm = groupPerm + 4;
+            }
+            if(fsop.rread){
+              othersPerm = 1;
+            }
+            if(fsop.rwrite){
+              othersPerm = othersPerm + 2;
+            }
+            if(fsop.rexecute){
+              othersPerm = othersPerm + 4;
+            }
           }
-          if(fsop.gexecute){
-            groupPerm = groupPerm + 4;
+          permissions = ownerPerm+""+groupPerm+""+othersPerm;
+          if(dirFiles === undefined){
+            dirFiles = false;
           }
-          if(fsop.rread){
-            othersPerm = 1;
+          var 
conf={"_path":fsop.path,"_permissions":permissions,"_dir-files":dirFiles};
+          var 
chmodElem=Ember.$('<chmod/>').attr("path",fsop.path).attr("permissions",permissions).attr("dir-files",dirFiles);
+          if (fsop.recursive){
+            chmodElem.append('<recursive/>');
           }
-          if(fsop.rwrite){
-            othersPerm = othersPerm + 2;
+          $root.append(chmodElem);
+          break;
+        case 'chgrp':
+          var dirFiles = fsop.dirfiles;
+          if(dirFiles === undefined){
+            dirFiles = false;
           }
-          if(fsop.rexecute){
-            othersPerm = othersPerm + 4;
+          var 
chGrpElem=Ember.$('<chgrp/>').attr("path",fsop.path).attr("group",fsop.group).attr("dir-files",dirFiles);
+          if (fsop.recursive){
+            chGrpElem.append('<recursive/>');
           }
-        }
-        permissions = ownerPerm+""+groupPerm+""+othersPerm;
-        if(dirFiles === undefined){
-          dirFiles = false;
-        }
-        var 
conf={"_path":fsop.path,"_permissions":permissions,"_dir-files":dirFiles};
-        if (fsop.recursive){
-          conf["recursive"]="";
-        }
-        nodeObj.fs["chmod"].push(conf);
-        break;
-        case "chgrp":
-        var dirFiles = fsop.dirfiles;
-        if(dirFiles === undefined){
-          dirFiles = false;
-        }
-        var conf={"_path":fsop.path,"_group":fsop.group,"_dir-files":dirFiles};
-        if (fsop.recursive){
-          conf["recursive"]="";
-        }
-        nodeObj.fs["chgrp"].push(conf);
-        break;
+          $root.append(chGrpElem);
+          break;
         default:
       }
     });
+    if (nodeObj.fs){
+        nodeObj['fs']=this.x2js.json2xml_str(nodeObj.fs)+$root.html();
+    }else{
+        nodeObj['fs']=$root.html();
+    }
+
+    console.log("generated root=",$root)
   },
-  handleImport(actionNode,json){
+  handleImport(actionNode,json,xmlDoc){
     this._super(actionNode,json);
     var commandKeys=["delete","mkdir","move","chmod","touchz","chgrp"];
+    var fsConfigs=xmlDoc[0].children[0].children;
     var fsOps=actionNode.domain.fsOps=[];
-    Object.keys(json).forEach(function(key){
-      if (commandKeys.contains(key)){
-        var fileOpsJson=null;
-        if (!Ember.isArray(json[key])){
-          fileOpsJson=[json[key]];
-        }else{
-          fileOpsJson=json[key];
-        }
-        fileOpsJson.forEach(function (fileOpJson) {
-          var fsConf={};
-          fsOps.push(fsConf);
-          fsConf.type=key;
-          var settings=fsConf;
-          switch (key) {
-            case "delete":
-            settings.path=fileOpJson._path;
-            break;
-            case "mkdir":
-            settings.path=fileOpJson._path;
-            break;
-            case "touchz":
-            settings.path=fileOpJson._path;
-            break;
-            case "move":
-            settings.source=fileOpJson._source;
-            settings.target=fileOpJson._target;
-            break;
-            case "chmod":
-            settings.path=fileOpJson._path;
-            settings.permissions=fileOpJson._permissions;
-            var perm = settings.permissions.toString();
-            if(isNaN(perm)){
-              var permList = {"-":0,"r":1,"w":2,"x":4}, permissionNumFormat = 
"", permTokenNum = 0, tempArr = [1,4,7];
-              for(let p=0; p<tempArr.length; p++){
-                  var permToken = perm.slice(tempArr[p],tempArr[p]+3);
-                  for(let q=0; q<permToken.length; q++){
-                    var tok = permList[permToken.slice(q,q+1)]
-                    permTokenNum = permTokenNum + tok;
-                  }
-                  permissionNumFormat = permissionNumFormat +""+ permTokenNum;
-                  permTokenNum = 0;
-              }
-              perm = permissionNumFormat;
+    for (var idx=0,len=fsConfigs.length;idx<len;idx++){
+      var fsCofig=fsConfigs[idx];
+      var tag=fsCofig.tagName;
+      var fsConf={};
+      fsOps.push(fsConf);
+      fsConf.type=tag;
+      var settings=fsConf;
+      switch (tag) {
+        case 'delete':
+          settings.path=fsCofig.getAttribute("path");
+          settings.skipTrash=fsCofig.getAttribute("skip-trash");
+          break;
+        case 'mkdir':
+          settings.path=fsCofig.getAttribute("path");
+          break;
+        case 'touchz':
+          settings.path=fsCofig.getAttribute("path");
+          break;
+        case 'move':
+          settings.source=fsCofig.getAttribute("source");
+          settings.target=fsCofig.getAttribute("target");
+          break;
+        case 'chmod':
+          settings.path=fsCofig.getAttribute("path");
+          settings.permissions=fsCofig.getAttribute("permissions");
+          settings.dirfiles==fsCofig.getAttribute("dir-files");
+          settings.recursive ==fsCofig.children.length===1 && 
fsCofig.children[0].tagName==="recursive";
+          var perm = settings.permissions.toString();
+          if(isNaN(perm)){
+            var permList = {"-":0,"r":1,"w":2,"x":4}, permissionNumFormat = 
"", permTokenNum = 0, tempArr = [1,4,7];
+            for(let p=0; p<tempArr.length; p++){
+                var permToken = perm.slice(tempArr[p],tempArr[p]+3);
+                for(let q=0; q<permToken.length; q++){
+                  var tok = permList[permToken.slice(q,q+1)]
+                  permTokenNum = permTokenNum + tok;
+                }
+                permissionNumFormat = permissionNumFormat +""+ permTokenNum;
+                permTokenNum = 0;
             }
-            for(var i=0; i< perm.length; i++){
-              var keyField;
-              if(i===0){
-                keyField = "o";
-              }else if(i===1){
-                keyField = "g";
-              }else if(i===2){
-                keyField = "r";
-              }
-              if(perm.slice(i,i+1) === "0"){
-                settings[keyField+"read"] = 0;
-                settings[keyField+"write"] = 0;
-                settings[keyField+"execute"] = 0;
-              }else if(perm.slice(i,i+1) === "1"){
-                settings[keyField+"read"] = 1;
-                settings[keyField+"write"] = 0;
-                settings[keyField+"execute"] = 0;
-              }else if(perm.slice(i,i+1) === "2"){
-                settings[keyField+"read"] = 0;
-                settings[keyField+"write"] = 2;
-                settings[keyField+"execute"] = 0;
-              }else if (perm.slice(i,i+1) === "3"){
-                settings[keyField+"read"] = 1;
-                settings[keyField+"write"] = 2;
-                settings[keyField+"execute"] = 0;
-              }else if (perm.slice(i,i+1) === "4"){
-                settings[keyField+"read"] = 0;
-                settings[keyField+"write"] = 0;
-                settings[keyField+"execute"] = 4;
-              }else if (perm.slice(i,i+1) === "5"){
-                settings[keyField+"read"] = 1;
-                settings[keyField+"write"] = 0;
-                settings[keyField+"execute"] = 4;
-              }else if (perm.slice(i,i+1) === "6"){
-                settings[keyField+"read"] = 0;
-                settings[keyField+"write"] = 2;
-                settings[keyField+"execute"] = 4;
-              }else if (perm.slice(i,i+1) === "7"){
-                settings[keyField+"read"] = 1;
-                settings[keyField+"write"] = 2;
-                settings[keyField+"execute"] = 4;
-              }
-            }
-            settings.dirfiles=fileOpJson["_dir-files"];
-            if(fileOpJson.hasOwnProperty("recursive")){
-              settings.recursive = true;
-            }else{
-              settings.recursive = false;
+            perm = permissionNumFormat;
+          }
+          for(var i=0; i< perm.length; i++){
+            var keyField;
+            if(i===0){
+              keyField = "o";
+            }else if(i===1){
+              keyField = "g";
+            }else if(i===2){
+              keyField = "r";
             }
-            break;
-            case "chgrp":
-            settings.path=fileOpJson._path;
-            settings.group=fileOpJson._group;
-            settings.dirfiles=fileOpJson["_dir-files"];
-            if(fileOpJson.hasOwnProperty("recursive")){
-              settings.recursive = true;
-            }else{
-              settings.recursive = false;
+            if(perm.slice(i,i+1) === "0"){
+              settings[keyField+"read"] = 0;
+              settings[keyField+"write"] = 0;
+              settings[keyField+"execute"] = 0;
+            }else if(perm.slice(i,i+1) === "1"){
+              settings[keyField+"read"] = 1;
+              settings[keyField+"write"] = 0;
+              settings[keyField+"execute"] = 0;
+            }else if(perm.slice(i,i+1) === "2"){
+              settings[keyField+"read"] = 0;
+              settings[keyField+"write"] = 2;
+              settings[keyField+"execute"] = 0;
+            }else if (perm.slice(i,i+1) === "3"){
+              settings[keyField+"read"] = 1;
+              settings[keyField+"write"] = 2;
+              settings[keyField+"execute"] = 0;
+            }else if (perm.slice(i,i+1) === "4"){
+              settings[keyField+"read"] = 0;
+              settings[keyField+"write"] = 0;
+              settings[keyField+"execute"] = 4;
+            }else if (perm.slice(i,i+1) === "5"){
+              settings[keyField+"read"] = 1;
+              settings[keyField+"write"] = 0;
+              settings[keyField+"execute"] = 4;
+            }else if (perm.slice(i,i+1) === "6"){
+              settings[keyField+"read"] = 0;
+              settings[keyField+"write"] = 2;
+              settings[keyField+"execute"] = 4;
+            }else if (perm.slice(i,i+1) === "7"){
+              settings[keyField+"read"] = 1;
+              settings[keyField+"write"] = 2;
+              settings[keyField+"execute"] = 4;
             }
-            break;
           }
-        });
+          break;
+        case 'chgrp':
+          settings.path=fsCofig.getAttribute("path");
+          settings.group=fsCofig.getAttribute("group");
+          settings.dirfiles==fsCofig.getAttribute("dir-files");
+          settings.recursive ==fsCofig.children.length===1 && 
fsCofig.children[0].tagName==="recursive";
+          break;
+        default:
+          break;
       }
-    });
+    }
   }
 });
 
export{ActionJobHandler,JavaActionJobHandler,PigActionJobHandler,HiveActionJobHandler,SqoopActionJobHandler,ShellActionJobHandler,
 EmailActionJobHandler,SparkActionJobHandler,MapRedActionJobHandler, 
Hive2ActionJobHandler, SubWFActionJobHandler, DistCpJobHandler, 
SshActionJobHandler, FSActionJobHandler, CustomActionJobHandler};

http://git-wip-us.apache.org/repos/asf/ambari/blob/135c0cbf/contrib/views/wfmanager/src/main/resources/ui/app/domain/node-handler.js
----------------------------------------------------------------------
diff --git 
a/contrib/views/wfmanager/src/main/resources/ui/app/domain/node-handler.js 
b/contrib/views/wfmanager/src/main/resources/ui/app/domain/node-handler.js
index 12d12d2..edfbc6c 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/domain/node-handler.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/domain/node-handler.js
@@ -116,7 +116,7 @@ var ActionNodeHandler= NodeHandler.extend({
       }
     });
   },
-  handleImportNode(type,nodeJson,workflow){
+  handleImportNode(type,nodeJson,workflow,xmlDoc){
     var actionType=this.get("actionTypeResolver").getActionType(nodeJson);
 
     var actionNode = 
this.nodeFactory.createActionNode(actionType,nodeJson._name);
@@ -126,7 +126,7 @@ var ActionNodeHandler= NodeHandler.extend({
     }
     var 
actionJobHandler=this.get("actionTypeResolver").getActionJobHandler(actionType);
     if(actionJobHandler){
-      actionJobHandler.handleImport(actionNode,nodeJson[actionType]);
+      actionJobHandler.handleImport(actionNode,nodeJson[actionType],xmlDoc);
     }
     if (nodeJson.info && nodeJson.info.__prefix==="sla") {
       actionNode.domain.slaEnabled=true;

http://git-wip-us.apache.org/repos/asf/ambari/blob/135c0cbf/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow-importer.js
----------------------------------------------------------------------
diff --git 
a/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow-importer.js 
b/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow-importer.js
index dd63a3a..ccf8209 100644
--- 
a/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow-importer.js
+++ 
b/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow-importer.js
@@ -33,6 +33,7 @@ var WorkflowImporter= Ember.Object.extend({
     return this.processWorkflowXml(workflowXml,workflow, errors);
   },
   processWorkflowXml(workflowXml,workflow, errors){
+    var xmlDoc= xmlDoc = Ember.$.parseXML( workflowXml );
     var workflowJson= this.get("x2js").xml_str2json(workflowXml);
     if (!workflowJson["workflow-app"]){
       throw "Invalid workflow";
@@ -53,7 +54,7 @@ var WorkflowImporter= Ember.Object.extend({
     }
     
this.workflowMapper.handleCredentialImport(workflow,workflowAppJson.credentials);
     
this.workflowMapper.handleParametersImport(workflow,workflowAppJson.parameters);
-    var nodeMap=this.setupNodeMap(workflowAppJson,workflow);
+    var nodeMap=this.setupNodeMap(workflowAppJson,workflow,Ember.$(xmlDoc));
     this.setupTransitions(workflowAppJson,nodeMap);
     workflow.set("startNode",nodeMap.get("start").node);
     this.populateKillNodes(workflow,nodeMap);
@@ -96,7 +97,7 @@ var WorkflowImporter= Ember.Object.extend({
     var actionNode=actionMapper.handleImportNode(action);
     nodeMap.set(actionNode.getName(),actionNode);
   },
-  setupNodeMap(workflowAppJson,workflow){
+  setupNodeMap(workflowAppJson,workflow,xmlDoc){
     var self=this;
     workflow.set("name",workflowAppJson["_name"]);
     var nodeMap=new Map();
@@ -109,7 +110,10 @@ var WorkflowImporter= Ember.Object.extend({
             nodeMap.set(jsonObj._name,{json:jsonObj,node:node});
           });
         }else{
-          var 
node=nodeHandler.handleImportNode(key,workflowAppJson[key],workflow);
+          if ('action'===key){//action handler.
+               var 
actionDom=xmlDoc.find("action[name='"+workflowAppJson[key]._name+ "']");
+          }
+          var 
node=nodeHandler.handleImportNode(key,workflowAppJson[key],workflow,actionDom);
           if (!workflowAppJson[key]._name){
             nodeMap.set(key,{json:workflowAppJson[key],node:node});
           }else{

http://git-wip-us.apache.org/repos/asf/ambari/blob/135c0cbf/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow-xml-generator.js
----------------------------------------------------------------------
diff --git 
a/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow-xml-generator.js
 
b/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow-xml-generator.js
index 7223581..a6e1eeb 100644
--- 
a/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow-xml-generator.js
+++ 
b/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow-xml-generator.js
@@ -22,7 +22,7 @@ import CustomMappingHandler from 
"../domain/custom-mapping-handler";
 
 var WorkflowGenerator= Ember.Object.extend({
   workflowMapper:null,
-  x2js : new X2JS({useDoubleQuotes:true}),
+  x2js : new X2JS({useDoubleQuotes:true,escapeMode:false}),
   workflow:null,
   workflowContext : {},
   nodeVisitor:null,

Reply via email to