| function getDgStartNode(nodeList){ |
| for(var i=0;i<nodeList.length;i++){ |
| if(nodeList[i].type == 'dgstart' && nodeList[i].wires != null && nodeList[i].wires != undefined){ |
| return nodeList[i]; |
| } |
| } |
| RED.notify("DGSTART node not found."); |
| return null; |
| } |
| |
| |
| var loopDetectionEnabled = true; |
| |
| function detectLoopPrev(){ |
| var activeWorkspace=RED.view.getWorkspace(); |
| /* |
| RED.nodes.links.filter(function(d) { |
| if(d.source.z == activeWorkspace && d.target.z == activeWorkspace){ |
| console.log(d.source.id+":"+d.sourcePort+":"+d.target.id); |
| } |
| }); |
| */ |
| //console.dir(RED.nodes.links); |
| var nSet=[]; |
| |
| RED.nodes.eachNode(function(n) { |
| if (n.z == activeWorkspace) { |
| nSet.push({'n':n}); |
| } |
| }); |
| |
| var nodeSet = RED.nodes.createExportableNodeSet(nSet); |
| //console.dir(nodeSet); |
| |
| //console.log("nodeSet length:" + nodeSet.length); |
| |
| var isLoopDetected = false; |
| var dgStartNode = getDgStartNode(nodeSet); |
| if(dgStartNode == null || dgStartNode == undefined) { |
| console.log("dgstart node not linked."); |
| return true; |
| } |
| |
| var wires = dgStartNode.wires; |
| var nodesInPath = {}; |
| var dgStartNodeId = dgStartNode.id; |
| if(wires != null && wires != undefined && wires[0] != undefined){ |
| for(var k=0;k<wires[0].length;k++){ |
| var val = wires[0][k]; |
| nodesInPath[dgStartNodeId + "->" + val] = ""; |
| } |
| }else{ |
| nodesInPath[dgStartNodeId + "->" + ""] = ""; |
| } |
| |
| //console.dir(nodesInPath); |
| var loopDetectedObj = {}; |
| /* the nodes will not be order so will need to loop thru again */ |
| for(var m=0;nodeSet != null && m<nodeSet.length;m++){ |
| for(var i=0;nodeSet != null && i<nodeSet.length;i++){ |
| var link=nodeSet[i].id; |
| //console.log("NAME:" + nodeSet[i].name + ":" + link); |
| if(link == dgStartNodeId) continue; |
| var wires = nodeSet[i].wires; |
| //console.log("link:" + link); |
| var delKeys = []; |
| if(wires != null && wires != undefined && wires[0] != undefined){ |
| for(var k=0;k<wires[0].length;k++){ |
| var val = (wires[0])[k]; |
| var keys = Object.keys(nodesInPath); |
| //console.log("keys:" + keys); |
| for (var j=0;j<keys.length;j++){ |
| //console.log("key:" + keys[j]); |
| //console.log("val:" + val); |
| var index = -1; |
| if(keys[j] != null){ |
| index = keys[j].indexOf("->" + link); |
| } |
| var lastIndex = keys[j].lastIndexOf("->"); |
| if(index != -1 && index == lastIndex){ |
| //delete nodesInPath[key]; |
| var previousNodeId = keys[j].substr(lastIndex +2); |
| var indexOfArrow = -1; |
| if(previousNodeId != ""){ |
| indexOfArrow = previousNodeId.indexOf("->"); |
| } |
| if(previousNodeId != null && indexOfArrow != -1){ |
| previousNodeId = previousNodeId.substr(0,indexOfArrow); |
| } |
| nodesInPath[keys[j] + "->" + val] = ""; |
| //console.log("keys[j]:" + keys[j]); |
| delKeys.push(keys[j]); |
| var prevNodeIdIndex = keys[j].indexOf("->" + previousNodeId); |
| var priorOccurence = keys[j].indexOf(val + "->"); |
| if(priorOccurence != -1 && priorOccurence<prevNodeIdIndex){ |
| //console.log("previousNodeId:" + previousNodeId); |
| //console.log("val:" + val); |
| var n1 = getNode(nodeSet,previousNodeId); |
| var n2 = getNode(nodeSet,val); |
| //console.log("loop detected for node " + n1.name + " and " + n2.name); |
| loopDetectedObj[n1.name + "->" + n2.name] ="looped"; |
| //console.dir(loopDetectedObj); |
| isLoopDetected = true; |
| } |
| } |
| } |
| } |
| } |
| for(var l=0;delKeys != null && l<delKeys.length;l++){ |
| delete nodesInPath[delKeys[l]]; |
| } |
| } |
| |
| |
| } |
| if(loopDetectedObj != null ){ |
| var msg = ""; |
| for(var key in loopDetectedObj){ |
| if(loopDetectedObj.hasOwnProperty(key)) { |
| console.log("Loop detected " + key); |
| msg += "<strong>Loop detected for:" + key + "</strong><br>"; |
| } |
| } |
| if(msg != ""){ |
| isLoopDetected = true; |
| RED.notify(msg); |
| } |
| } |
| /* |
| for(var i=0;nodeSet != null && i<nodeSet.length;i++){ |
| var foundCount=0; |
| var nodeId = nodeSet[i].id; |
| var nodeName = nodeSet[i].name; |
| for(var j=0;nodeSet != null && j<nodeSet.length;j++){ |
| var node = nodeSet[j]; |
| if(node.id == nodeId){ |
| continue; |
| } |
| var wires = node.wires; |
| console.log(node.type + ":wires:" + wires); |
| for(var k=0;wires != null && wires != undefined && wires[0] != undefined && k<wires[0].length;k++){ |
| var id = (wires[0])[k]; |
| console.log(nodeName + ":" + nodeId + ":" + id); |
| if(id == nodeId ){ |
| foundCount++; |
| if(foundCount>1){ |
| console.log("Loop detected for node " + nodeName + "with node:" + node.name); |
| RED.notify("<strong>Flow error detected for node '" + nodeName + "' with node '" + node.name + "'</strong>"); |
| //RED.nodes.eachLink(function(d){ |
| // if(d.source.id == nodeSet[i] || d.target.id == nodeSet[j]){ |
| // d.selected = true; |
| // }else if(d.source.id == nodeSet[j] || d.target.id == nodeSet[i]){ |
| // d.selected = true; |
| // } |
| //}); |
| //RED.view.redraw(); |
| isLoopDetected = true; |
| return true; |
| } |
| } |
| } |
| |
| } |
| } |
| */ |
| //console.log("isLoopDetected:" + isLoopDetected); |
| return isLoopDetected; |
| } |
| |
| function generateNodePath(nodeIdToNodeObj,nodeId,pathStr,nodesInPath,errList){ |
| var node = nodeIdToNodeObj[nodeId]; |
| var wires = node.wires; |
| if(wires != null && wires != undefined && wires[0] != undefined){ |
| for(var k=0;k<wires[0].length;k++){ |
| var val = wires[0][k]; |
| if(pathStr.indexOf(val + "->") != -1){ |
| //console.log("pathStr:" + pathStr); |
| var n1= nodeIdToNodeObj[nodeId].name; |
| var n2= nodeIdToNodeObj[val].name; |
| errList.push("Loop detected between nodes '" + n1 + "' and " + "'" + n2 + "'"); |
| }else{ |
| pathStr += "->" + val ; |
| generateNodePath(nodeIdToNodeObj,val,pathStr,nodesInPath,errList); |
| } |
| } |
| }else{ |
| //pathStr += nodeId + "->" + ""; |
| nodesInPath.push(pathStr); |
| } |
| } |
| |
| function detectLoop(){ |
| var activeWorkspace=RED.view.getWorkspace(); |
| var nSet=[]; |
| var nodeIdToNodeObj = {}; |
| RED.nodes.eachNode(function(n) { |
| if (n.z == activeWorkspace) { |
| nSet.push({'n':n}); |
| } |
| }); |
| |
| var nodeSet = RED.nodes.createExportableNodeSet(nSet); |
| nodeIdToNodeObj = getNodeIdToNodeMap(nodeSet); |
| var isLoopDetected = false; |
| //var dgStartNode = getDgStartNode(nodeSet); |
| var dgStartNode = nodeIdToNodeObj["dgstart"]; |
| var errList = []; |
| var dgStartNodeId = dgStartNode.id; |
| var nodesInPathArr = []; |
| generateNodePath(nodeIdToNodeObj,dgStartNodeId,dgStartNodeId,nodesInPathArr,errList); |
| if(errList != null && errList != undefined && errList.length > 0){ |
| isLoopDetected = true; |
| var htmlStr="<div id='loop-detect-err-list-div'><table id='loopErrListTable' border='1'><tr><th>Error List</th></tr>"; |
| for(var j=0;errList != null && j<errList.length;j++){ |
| var errSeq = j+1; |
| htmlStr += "<tr><td>" + errSeq + ")" + errList[j] + "</td></tr>"; |
| } |
| htmlStr += "</table></div>"; |
| |
| $("#loop-detection-dialog").dialog({ |
| autoOpen : false, |
| modal: true, |
| title: "DG Flow validation Error List ", |
| width: 500, |
| buttons: { |
| Close: function () { |
| $("#loop-detection-dialog").dialog("close"); |
| } |
| } |
| }).dialog("open").html(htmlStr); // end dialog div |
| } |
| nodesInPathArr=null; |
| nodeSet ={}; |
| nodeIdToNodeObj={}; |
| return isLoopDetected; |
| } |
| |
| |
| var xmlNumberCnt = 0; |
| function processForXmlNumbers(nodeSet,node){ |
| if( node != null && node.type != 'dgstart'){ |
| if(node.xmlnumber != null && node.xmlnumber){ |
| node.xmlnumber.push(++xmlNumberCnt); |
| }else{ |
| node.xmlnumber = [++xmlNumberCnt]; |
| } |
| } |
| |
| if(node != null && node.wires != null && node.wires.length>0){ |
| var wiredNodes=node.wires[0]; |
| var wiredNodesArr=[]; |
| for(var k=0;wiredNodes != undefined && wiredNodes != null && k<wiredNodes.length;k++){ |
| wiredNodesArr.push(getNode(nodeSet,wiredNodes[k])); |
| } |
| |
| //use this sort to sort by y position |
| wiredNodesArr.sort(function(a, b){ |
| return a.y-b.y; |
| }); |
| |
| for(var k=0;k<wiredNodesArr.length;k++){ |
| var n = wiredNodesArr[k]; |
| processForXmlNumbers(nodeSet,n); |
| } |
| } |
| } |
| |
| function updateXmlNumbers(){ |
| xmlNumberCnt = 0; |
| var nodeSet = getCurrentFlowNodeSet(); |
| if(nodeSet == null && nodeSet.length >0){ |
| nodeSet.forEach(function(n){ |
| if(n.xmlnumber){ |
| delete n.xmlnumber; |
| } |
| }); |
| } |
| var dgStartNode = getDgStartNode(nodeSet); |
| processForXmlNumbers(nodeSet,dgStartNode); |
| var activeWorkspace=RED.view.getWorkspace(); |
| RED.nodes.eachNode(function(n) { |
| //console.log("Node processed in eachNode"); |
| if (n.z == activeWorkspace) { |
| if(n != null){ |
| var updatedNode = getNode(nodeSet,n.id); |
| //console.log("updated Node processed in eachNode"); |
| //console.dir(updatedNode); |
| |
| if (n.id == updatedNode.id) { |
| n.xmlnumber = updatedNode.xmlnumber; |
| n.dirty = true; |
| } |
| } |
| } |
| }); |
| } |
| |
| function getOutcomeValue(node){ |
| var xmlStr = ""; |
| if(node != null && node.xml != undefined && node.xml !=""){ |
| xmlStr = node.xml + "</outcome>"; |
| } |
| var xmlDoc; |
| if (window.DOMParser){ |
| try{ |
| var parser=new DOMParser(); |
| xmlDoc=parser.parseFromString(xmlStr,'text/xml'); |
| //console.log("Not IE"); |
| var n = xmlDoc.documentElement.nodeName; |
| if(n == "html"){ |
| resp=false; |
| console.log("Error parsing"); |
| return resp; |
| } |
| }catch(e){ |
| console.log("xmlStr:" + xmlStr); |
| console.log("Error parsing" +e); |
| return null; |
| } |
| }else{ |
| try{ |
| //console.log("IE"); |
| // code for IE |
| xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); |
| xmlDoc.async=false; |
| xmlDoc.loadXMLString(xmlStr); |
| }catch(e){ |
| console.log("xmlStr:" + xmlStr); |
| console.log("Error parsing" +e); |
| return null; |
| } |
| } |
| if(xmlDoc != null){ |
| var xmlNode = xmlDoc.documentElement; |
| //console.dir(xmlNode); |
| var processedNode = xmlNode.nodeName; |
| //console.log("processedNode:" + processedNode); |
| var attrs = xmlNode.attributes; |
| for(var i=0;i<attrs.length;i++){ |
| if(attrs[i].nodeName == "value"){ |
| return attrs[i].value; |
| } |
| } |
| } |
| return null; |
| } |
| |
| var dgNumberCnt = 0; |
| function processForDgNumbers(nodeSet,node){ |
| var outcomeTypes = [ "already-active", "failure", "not-found", "other", "outcomeFalse", "outcome", "outcomeTrue", "success" ]; |
| if( node != null && node.type != 'dgstart' && node.type != 'service-logic' && node.type != 'method' ){ |
| //console.log("child of " + parentNodeType + " :" + nodeType); |
| //check if NOT outcome node |
| if(outcomeTypes.indexOf(node.type) == -1){ |
| if(node.type == "GenericXML"){ |
| if(node.xml != undefined && node.xml != null && node.xml.indexOf("<outcome ") != -1){ |
| //this GenericXML node is used for outcome , so need to skip |
| }else{ |
| if(node.dgnumber != undefined && node.dgnumber != null && node.dgnumber){ |
| node.dgnumber.push(++dgNumberCnt); |
| }else{ |
| node.dgnumber = [++dgNumberCnt]; |
| } |
| } |
| |
| }else{ |
| if(node.dgnumber != undefined && node.dgnumber != null && node.dgnumber){ |
| node.dgnumber.push(++dgNumberCnt); |
| }else{ |
| node.dgnumber = [++dgNumberCnt]; |
| } |
| } |
| } |
| } |
| |
| var hasOutcomeNodes = false; |
| if(node != null && node.wires != null && node.wires.length>0){ |
| var wiredNodes=node.wires[0]; |
| var wiredNodesArr=[]; |
| for(var k=0;wiredNodes != undefined && wiredNodes != null && k<wiredNodes.length;k++){ |
| var wiredNode = getNode(nodeSet,wiredNodes[k]); |
| //check if outcome node |
| if(outcomeTypes.indexOf(wiredNode.type) != -1){ |
| hasOutcomeNodes = true; |
| } |
| if(wiredNode.type == "GenericXML"){ |
| if( node.xml != undefined && node.xml != null && node.xml.indexOf("<outcome ") != -1){ |
| //this GenericXML node is used for outcome |
| hasOutcomeNodes = true; |
| } |
| } |
| wiredNodesArr.push(wiredNode); |
| |
| } |
| |
| //use this sort to sort by y position |
| wiredNodesArr.sort(function(a, b){ |
| return a.y-b.y; |
| }); |
| |
| /* |
| //USE THIS LOGIC TO SORT BY OUTCOME VALUE FOR SPECIFIC NODES |
| var parentNodeType = node.type; |
| if(hasOutcomeNodes && parentNodeType != 'switchNode' && parentNodeType != 'block' && parentNodeType != 'configure' ){ |
| //use the value of outcome to sort the wired nodes |
| wiredNodesArr.sort(function(a, b){ |
| var val1 = getOutcomeValue(a); |
| var val2 = getOutcomeValue(b); |
| //console.log("val1:" + val1); |
| //console.log("val2:" + val2); |
| if ( val1 < val2 ){ |
| return -1; |
| }else if ( val1 > val2 ){ |
| return 1; |
| }else{ |
| return 0; |
| } |
| }); |
| }else{ |
| //use this sort to sort by y position |
| wiredNodesArr.sort(function(a, b){ |
| return a.y-b.y; |
| }); |
| } |
| |
| */ |
| |
| for(var k=0;k<wiredNodesArr.length;k++){ |
| var n = wiredNodesArr[k]; |
| processForDgNumbers(nodeSet,n); |
| } |
| } |
| } |
| |
| function updateDgNumbers(){ |
| dgNumberCnt = 0; |
| var nodeSet = getCurrentFlowNodeSet(); |
| if(nodeSet == null && nodeSet.length >0){ |
| nodeSet.forEach(function(n){ |
| if(n.dgnumber){ |
| delete n.dgnumber; |
| } |
| }); |
| } |
| var dgStartNode = getDgStartNode(nodeSet); |
| processForDgNumbers(nodeSet,dgStartNode); |
| var activeWorkspace=RED.view.getWorkspace(); |
| RED.nodes.eachNode(function(n) { |
| //console.log("Node processed in eachNode"); |
| if (n.z == activeWorkspace) { |
| if(n != null){ |
| var updatedNode = getNode(nodeSet,n.id); |
| //console.log("updated Node processed in eachNode"); |
| //console.dir(updatedNode); |
| |
| if (n.id == updatedNode.id) { |
| //console.log(n.type + ":" + updatedNode.dgnumber); |
| n.dgnumber = updatedNode.dgnumber; |
| n.dirty = true; |
| } |
| } |
| } |
| }); |
| return nodeSet; |
| } |
| |
| function customValidation(currNodeSet){ |
| //validation to make sure there a block node infront of mutiple dgelogic nodes |
| flowDesignErrors=[]; |
| var dgStartCnt=0; |
| var serviceLogicCnt=0; |
| var methodCnt=0; |
| for(var i=0;currNodeSet != null && i<currNodeSet.length;i++){ |
| var node = currNodeSet[i]; |
| var parentNodeName = node.name; |
| var parentNodeType = node.type; |
| var dgNumber = node.dgnumber; |
| if(parentNodeType == 'dgstart'){ |
| dgStartCnt++; |
| } |
| if(parentNodeType == 'service-logic'){ |
| serviceLogicCnt++; |
| } |
| if(parentNodeType == 'method'){ |
| methodCnt++; |
| } |
| if(parentNodeType == "GenericXML"){ |
| if( node.xml != undefined && node.xml != null && node.xml.indexOf("<service-logic ") != -1 ){ |
| //this GenericXML node is used for service-logic |
| serviceLogicCnt++; |
| }else if( node.xml != undefined && node.xml != null && node.xml.indexOf("<method ") != -1 ){ |
| //this GenericXML node is used for method |
| methodCnt++; |
| }else if( node.xml != undefined && node.xml != null && node.xml.indexOf("<block") != -1 ){ |
| //this GenericXML node is used for block |
| parentNodeType = "block"; |
| } |
| } |
| if(node != null && node.wires != null && node.wires.length>0){ |
| var wiredNodes=node.wires[0]; |
| var wiredNodesArr=[]; |
| for(var k=0;wiredNodes != undefined && wiredNodes != null && k<wiredNodes.length;k++){ |
| wiredNodesArr.push(getNode(currNodeSet,wiredNodes[k])); |
| } |
| var countChildLogicNodes =0; |
| for(var k=0;k<wiredNodesArr.length;k++){ |
| var n = wiredNodesArr[k]; |
| var nodeType = n.type; |
| var outcomeTypes = [ "already-active", "failure", "not-found", "other", "outcomeFalse", "outcome", "outcomeTrue", "success" ]; |
| var isOutcomeOrSetNode = false; |
| if(nodeType == "GenericXML"){ |
| if( n.xml != undefined && n.xml != null && (n.xml.indexOf("<outcome ") != -1 || n.xml.indexOf("<set ") != -1)){ |
| //this GenericXML node is used for outcome |
| isOutcomeOrSetNode = true; |
| } |
| } |
| //console.log("child of " + parentNodeType + " :" + nodeType); |
| if(outcomeTypes.indexOf(nodeType) > -1 ||nodeType == 'set' || isOutcomeOrSetNode){ |
| //its a outcome or set node |
| }else{ |
| countChildLogicNodes++; |
| } |
| |
| //console.log("parentNodeType:" + parentNodeType); |
| if(countChildLogicNodes >1 && parentNodeType != 'block' && parentNodeType != 'for' ){ |
| if(node.dgnumber != undefined && node.dgnumber){ |
| flowDesignErrors.push("Warning:May need a block Node after Node. <br><span style='color:red'>Node Name:</span>" + node.name + "<br><span style='color:red'>DG Number:</span>" + node.dgnumber[0] ); |
| }else{ |
| flowDesignErrors.push("Warning:May need a block Node after Node <br><span style='color:red'>Node name:</span>" + parentNodeName); |
| } |
| break; |
| } |
| } |
| } |
| } |
| if(dgStartCnt > 1){ |
| flowDesignErrors.push("Error:There should only be 1 dgstart Node in the current workspace."); |
| } |
| |
| if(serviceLogicCnt > 1){ |
| flowDesignErrors.push("Error:There should only be 1 service-logic Node in the current workspace."); |
| } |
| |
| if(methodCnt > 1){ |
| flowDesignErrors.push("Error:There should only be 1 method Node in the current workspace."); |
| } |
| |
| if(flowDesignErrors != null && flowDesignErrors.length >0){ |
| return false; |
| } |
| return true; |
| } |
| |
| var flowDesignErrors = []; |
| function showFlowDesignErrorBox(){ |
| if(flowDesignErrors != null && flowDesignErrors.length >0){ |
| var htmlStr="<div id='flowpath-err-list-div'><table id='fpeTable' border='1'><tr><th>Error List</th></tr>"; |
| for(var j=0;flowDesignErrors != null && j<flowDesignErrors.length;j++){ |
| var errSeq = j+1; |
| htmlStr += "<tr><td>" + errSeq + ")" + flowDesignErrors[j] + "</td></tr>"; |
| } |
| htmlStr += "</table></div>"; |
| |
| //$('<div></div>').dialog({ |
| |
| $('#flow-design-err-dialog').dialog({ |
| modal: true, |
| title: "Flow design Error List ", |
| width: 500, |
| /*open: function () { |
| $(this).html(htmlStr); |
| },*/ |
| buttons: { |
| Close: function () { |
| $(this).dialog("close"); |
| } |
| } |
| }).html(htmlStr); // end dialog div |
| } |
| } |
| |
| |
| function getCurrentFlowNodeSet(){ |
| var nodeSet=[]; |
| //console.dir(RED); |
| //RED.view.dirty(); |
| //RED.view.redraw(); |
| var activeWorkspace=RED.view.getWorkspace(); |
| RED.nodes.eachNode(function(n) { |
| if (n.z == activeWorkspace) { |
| nodeSet.push({'n':n}); |
| } |
| }); |
| |
| var exportableNodeSet = RED.nodes.createExportableNodeSet(nodeSet); |
| //console.dir(exportableNodeSet); |
| //console.log(JSON.stringify(exportableNodeSet)); |
| return exportableNodeSet; |
| } |
| |
| function getNode(nodeSet,id){ |
| for(var i=0;i<nodeSet.length;i++){ |
| if(nodeSet[i].id == id){ |
| return nodeSet[i]; |
| } |
| } |
| return null; |
| } |
| function getNodeIdToNodeMap(nodeSet){ |
| var nodeIdToNodeMap ={}; |
| for(var i=0;i<nodeSet.length;i++){ |
| nodeIdToNodeMap[nodeSet[i].id] = nodeSet[i]; |
| if(nodeSet[i].type == "dgstart"){ |
| nodeIdToNodeMap["dgstart"] = nodeSet[i]; |
| } |
| } |
| return nodeIdToNodeMap; |
| } |
| |
| function validateEachNodeXml(){ |
| var activeWorkspace=RED.view.getWorkspace(); |
| RED.nodes.eachNode(function(n) { |
| if (n.z == activeWorkspace) { |
| var xml = n.xml; |
| if( xml != null && xml != ''){ |
| var validationSuccess = validateXML(n.xml); |
| if(validationSuccess){ |
| n.status = {fill:"green",shape:"dot",text:"OK"}; |
| }else{ |
| n.status = {fill:"red",shape:"dot",text:"ERROR"}; |
| } |
| } |
| } |
| }); |
| } |
| |
| |
| function getNodeToXml(inputNodeSet){ |
| var exportableNodeSet; |
| //uses inputNodeSet if passed otherwise build the latest nodeSet |
| |
| //$("#btn-deploy").removeClass("disabled"); |
| |
| |
| function getNode(id){ |
| for(var i=0;i<exportableNodeSet.length;i++){ |
| if(exportableNodeSet[i].id == id){ |
| return exportableNodeSet[i]; |
| } |
| } |
| return null; |
| } |
| |
| function getStartTag(node){ |
| var startTag=""; |
| var xmlStr=""; |
| if(node != null && node.type != 'dgstart'){ |
| xmlStr=node.xml; |
| var regex = /(<)([\w-]+)(.*)?/; |
| var match = regex.exec(xmlStr); |
| if(match != null){ |
| if(match[1] != undefined && match[2] != undefined){ |
| startTag = match[2]; |
| } |
| }else{ |
| console.log("startTag not found."); |
| } |
| } |
| return startTag; |
| } |
| |
| if(inputNodeSet == null || inputNodeSet == undefined){ |
| exportableNodeSet = getCurrentFlowNodeSet(); |
| }else{ |
| exportableNodeSet = JSON.parse(inputNodeSet); |
| } |
| var dgstartNode = getDgStartNode(exportableNodeSet); |
| |
| var level=0; |
| var fullXmlStr=""; |
| |
| printXml(dgstartNode); |
| |
| |
| function printXml(node){ |
| var xmlStr=""; |
| var startTag = ""; |
| if(node != null && node.type != 'dgstart'){ |
| var comments=node.comments; |
| if(comments != null && comments != ""){ |
| //if xml comments field already has the <!-- and --> remove them |
| comments=comments.replace("<!--",""); |
| comments=comments.replace("-->",""); |
| xmlStr="<!--" + comments + "-->"; |
| } |
| xmlStr+=node.xml; |
| startTag = getStartTag(node); |
| //special handling for break node |
| if(xmlStr != undefined && xmlStr != null && xmlStr.trim() == "<break>"){ |
| fullXmlStr += "<break/>"; |
| }else{ |
| fullXmlStr +=xmlStr; |
| } |
| /* |
| if(level > 0){ |
| var spacing = Array(level).join(" "); |
| xmlStr=xmlStr.replace(/\n/g,spacing); |
| fullXmlStr +=xmlStr; |
| |
| console.log(xmlStr); |
| }else{ |
| fullXmlStr +=xmlStr; |
| console.log(xmlStr); |
| } |
| */ |
| } |
| |
| //console.log("startTag:" + startTag); |
| |
| var wiredNodes = []; |
| var wiredNodesArr = []; |
| if(node != null && node.wires != null && node.wires[0] != null && node.wires[0] != undefined && node.wires[0].length >0 ){ |
| wiredNodes=node.wires[0]; |
| //console.log("Before sort"); |
| for(var k=0;wiredNodes != undefined && wiredNodes != null && k<wiredNodes.length;k++){ |
| wiredNodesArr.push(getNode(wiredNodes[k])); |
| } |
| //console.dir(wiredNodesArr); |
| //sort based on y position |
| wiredNodesArr.sort(function(a, b){ |
| return a.y-b.y; |
| }); |
| //console.log("After sort"); |
| //console.dir(wiredNodesArr); |
| } |
| |
| for(var k=0;wiredNodesArr != null && k<wiredNodesArr.length;k++){ |
| level++; |
| var nd = wiredNodesArr[k]; |
| printXml(nd); |
| } |
| |
| //append end tag |
| if(startTag != ""){ |
| if(startTag != "break"){ |
| fullXmlStr += "</" + startTag + ">"; |
| } |
| /* |
| if(level >0){ |
| var spacing = Array(level).join(" "); |
| fullXmlStr += spacing + "</" + startTag + ">"; |
| console.log(spacing + "</" + startTag + ">"); |
| }else{ |
| fullXmlStr += "</" + startTag + ">"; |
| console.log("</" + startTag + ">"); |
| } |
| */ |
| } |
| |
| /*if(level>0){ |
| level=level-1; |
| } |
| */ |
| //console.log("endTag:" + startTag); |
| //console.log("xml:" + fullXmlStr); |
| } |
| //console.log("fullXmlStr:" + fullXmlStr); |
| return fullXmlStr; |
| } |
| |
| function showFlow(filePath){ |
| var jqxhr = $.post( "/getSharedFlow",{"filePath":filePath}) |
| .done(function(data) { |
| $( "#dgflow-browser-dialog").dialog("close"); |
| var migratedNodes = migrateNodes(data); |
| var nodeSet = getCurrentFlowNodeSet(); |
| //console.dir(nodeSet); |
| if(nodeSet != null && nodeSet.length == 0){ |
| RED.view.setIsImportAction(true); |
| } |
| //RED.view.importNodes(data) |
| RED.view.importNodes(JSON.stringify(migratedNodes)); |
| //console.log( "import done"); |
| }) |
| .fail(function() { |
| RED.notify("Could not import user flow ."); |
| $( "#dgflow-browser-dialog").dialog("close"); |
| console.log( "error occured importing flow."); |
| }) |
| .always(function() { |
| //console.log( "complete" ); |
| }); |
| } |
| |
| function showFlowXml(filePath){ |
| var jqxhr = $.post( "/getSharedFlow",{"filePath":filePath}) |
| .done(function(data) { |
| //console.dir(data); |
| var xmlStr=getNodeToXml(data); |
| showImportedXml(xmlStr,this); |
| }) |
| .fail(function() { |
| RED.notify("Could not convert to XML."); |
| $( "#dgflow-browser-dialog").dialog("close"); |
| console.log( "error occured importing flow."); |
| }) |
| .always(function() { |
| //console.log( "complete" ); |
| }); |
| } |
| |
| function showFlowFiles(userName){ |
| //var divStyle="color:#07c; margin-bottom: 1.2em; font-size: 16px;"; |
| //var divStyle="<style>#data-container a { color: #067ab4; font-size: 0.75em;} #data-container a:hover { text-decoration: underline; padding: -15px -15px -15px 15px; } </style>"; |
| var divStyle="<style>#data-container a { color: #067ab4; font-size: 0.75em;} #data-container a:hover { text-decoration: underline; padding: -15px -15px -15px 15px; } .header { height: 40px; border-bottom: 1px solid #EEE; background-color: #ffffff; height: 40px; -webkit-border-top-left-radius: 5px; -webkit-border-top-right-radius: 5px; -moz-border-radius-topleft: 5px; -moz-border-radius-topright: 5px; border-top-left-radius: 5px; border-top-right-radius: 5px; } .footer { height: 40px; background-color: whiteSmoke; border-top: 1px solid #DDD; -webkit-border-bottom-left-radius: 5px; -webkit-border-bottom-right-radius: 5px; -moz-border-radius-bottomleft: 5px; -moz-border-radius-bottomright: 5px; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; }</style>"; |
| |
| var htmlStr=divStyle + "<div class='header'>List of Flow files of User " + userName + "</div><div id='data-container'><ul>" ; |
| $.post( "/getFiles/" + userName) |
| .done(function( data ) { |
| //console.dir(data); |
| //console.log("found " + data.length + " files"); |
| if(data != null && data.length != undefined && data.length != 0){ |
| if(data != null && data.length>0){ |
| for(var k=0;k<data.length;k++){ |
| htmlStr += "<li><a href=\"#\" onclick=\"showFlow('" +data[k].filePath + "')\">" + data[k].name + "</a></li>"; |
| /* |
| //Use this code to display the View Xml Link |
| htmlStr += "<li><a href=\"#\" onclick=\"showFlow('" +data[k].filePath + "')\">" + data[k].name + "</a><span style=\"margin-left:15px;color:blue\"><a href=\#\" onclick=\"showFlowXml('" +data[k].filePath + "')\">[View Xml]</a></span></li>"; |
| */ |
| } |
| htmlStr+="</ul></div>"; |
| } |
| $( "#dgflow-browser-dialog").html(htmlStr); |
| }else{ |
| //console.log("no flow files found for user " + userName); |
| var noFlowFilesHtml = divStyle + "<div id='data-container'><p>No downloaded Flow files found in " + userName + " directory</p><a href='#' onclick='javascript:closeAndShowFlowShareUsers()'>Back to List.</a></div>"; |
| $( "#dgflow-browser-dialog").html(noFlowFilesHtml); |
| } |
| }) |
| .fail(function(err) { |
| console.log( "error" + err ); |
| }) |
| .always(function() { |
| //console.log("done"); |
| }); |
| |
| } |
| |
| function closeAndShowFlowShareUsers(){ |
| $("#dgflow-browser-dialog").dialog( "close" ); |
| var divStyle="<style>#data-container a { color: #067ab4; font-size: 0.75em;} #data-container a:hover { text-decoration: underline; padding: -15px -15px -15px 15px; } .header { height: 40px; border-bottom: 1px solid #EEE; background-color: #ffffff; height: 40px; -webkit-border-top-left-radius: 5px; -webkit-border-top-right-radius: 5px; -moz-border-radius-topleft: 5px; -moz-border-radius-topright: 5px; border-top-left-radius: 5px; border-top-right-radius: 5px; } .footer { height: 40px; background-color: whiteSmoke; border-top: 1px solid #DDD; -webkit-border-bottom-left-radius: 5px; -webkit-border-bottom-right-radius: 5px; -moz-border-radius-bottomleft: 5px; -moz-border-radius-bottomright: 5px; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; }</style>"; |
| $.get( "/flowShareUsers") |
| .done(function( data ) { |
| |
| var header="<div class='header'>List of downloaded DG Flows </div>"; |
| var html= divStyle + header + "<div id='data-container'>"; |
| html+="<ul>"; |
| if(data != null){ |
| var users=data.flowShareUsers; |
| users.sort(function (a,b){ |
| if(a.name > b.name){ |
| return 1; |
| }else if(a.name < b.name){ |
| return -1; |
| }else{ |
| return 0; |
| } |
| }); |
| for(var i=0;users != null && i<users.length;i++){ |
| html+="<li><a href=\"#\" onclick=\"showFlowFiles('" + users[i].rootDir + "')\">" + users[i].name + "</a></li>"; |
| } |
| } |
| html+="</ul>"; |
| html+="</div>"; |
| $( "#dgflow-browser-dialog" ).dialog({ |
| title: "Dowloaded DG Flow Browser", |
| modal: true, |
| autoOpen: true, |
| width: 530, |
| height: 530, |
| buttons: [ |
| { |
| text: "Close", |
| click: function() { |
| $( this ).dialog( "close" ); |
| } |
| } |
| ] |
| }).html(html); |
| $("#dgflow-browser-dialog").show(); |
| }) |
| .fail(function(err) { |
| RED.notify("Failed to get users."); |
| }) |
| .always(function() { |
| }); |
| } |
| |
| function showImportedXml(xmlStr,dialogBox){ |
| var formattedXml=vkbeautify.xml(xmlStr); |
| var that = dialogBox; |
| require(["orion/editor/edit"], function(edit) { |
| that.editor = edit({ |
| parent:document.getElementById('dgflow-browser-dialog'), |
| lang:"html", |
| readonly:true, |
| contents: formattedXml |
| }); |
| RED.library.create({ |
| url:"functions", // where to get the data from |
| type:"function", // the type of object the library is for |
| editor:that.editor, // the field name the main text body goes to |
| fields:['name','outputs'] |
| }); |
| }); |
| } |
| |
| function getTag(xmlStr){ |
| var tag= null ; |
| if(xmlStr != null){ |
| xmlStr = xmlStr.trim(); |
| } |
| try{ |
| var regex = new RegExp("(<)([^ >]+)"); |
| var match = regex.exec(xmlStr); |
| if(match != null){ |
| if(match[1] != undefined && match[2] != undefined){ |
| tag = match[2]; |
| } |
| } |
| }catch(e){ |
| console.log(e); |
| } |
| return tag; |
| |
| } |
| |
| function getAttributeValue(xmlStr,attribute){ |
| |
| var attrVal=null; |
| try{ |
| var myRe = new RegExp(attribute + "[\s+]?=[\s+]?['\"]([^'\"]+)['\"]","m"); |
| var myArray = myRe.exec(xmlStr); |
| if(myArray != null && myArray[1] != null){ |
| attrVal=myArray[1]; |
| } |
| }catch(err){ |
| console.log(err); |
| } |
| return attrVal; |
| } |
| |
| function showOrHideTab(checkbox,idVal){ |
| |
| var activeWorkspace=RED.view.getWorkspace(); |
| var table = $("#ftab02"); |
| $('td input:checkbox',table).each(function(i){ |
| console.log(this.checked); |
| }); |
| //console.dir($('td input:checkbox',table).prop('checked',this.checked)); |
| |
| $(".red-ui-tabs li a").each(function(i){ |
| var id=$(this).attr("href").replace('#',''); |
| if(id == idVal){ |
| $(this).parent().toggle(); |
| var isVisible = $(this).parent().is(":visible"); |
| if(isVisible){ |
| checkbox.checked = true; |
| }else{ |
| checkbox.checked = false; |
| } |
| if(activeWorkspace == id){ |
| //$("#chart").hide(); |
| //var li = ul.find("a[href='#"+id+"']").parent(); |
| var li = $(this).parent(); |
| if (li.hasClass("active")) { |
| li.removeClass("active"); |
| if(li.parent().children().size() != 0){ |
| } |
| console.log("has Class active"); |
| var tab = li.prev(); |
| if (tab.size() === 0) { |
| console.log("li prev size 0"); |
| tab = li.next(); |
| } |
| if(tab.is(":visible")){ |
| console.log("added active"); |
| tab.addClass("active"); |
| tab.click(); |
| //tab.trigger("click"); |
| } |
| //console.dir(tab); |
| //tab.parent().addClass("active"); |
| //tab.click(); |
| } |
| }else{ |
| console.log("added active id" +id); |
| if(isVisible){ |
| var li = $(this).parent(); |
| li.addClass("active"); |
| li.click(); |
| //console.dir(li); |
| }else{ |
| var li = $(this).parent(); |
| li.removeClass("active"); |
| } |
| } |
| } |
| }); |
| /* |
| $(".red-ui-tabs li a").each(function(i){ |
| var id=$(this).attr("href").replace('#',''); |
| if(id != idVal){ |
| $(this).trigger("click"); |
| if(activeWorkspace == idVal){ |
| $("#chart").show(); |
| } |
| return false; |
| } |
| }); |
| */ |
| } |
| |
| function performGitCheckout(){ |
| $("#responseId").text(""); |
| if(!event) event = window.event; |
| var target = $(event.target); |
| target.val("Processing"); |
| target.css({ "background-image": "url('images/page-loading.gif')" }); |
| target.css({ "background-repeat": "no-repeat" }); |
| target.css({ "background-size": "25px 25px" }); |
| |
| var branch = document.getElementById("branchId").value.trim(); |
| var statusObj = document.getElementById("responseId"); |
| if(branch == null || branch == ''){ |
| statusObj.innerText = "Branch is required."; |
| return; |
| } |
| var urlVal = "/gitcheckout?branch=" + branch; |
| $.get(urlVal) |
| .done(function( data ) { |
| var output = data.output; |
| if(output != null){ |
| output=output.replace(/\n/g,"<br>"); |
| statusObj.innerHTML = output; |
| } |
| }) |
| .fail(function(err) { |
| statusObj.innerText = "Failed to do git checkout."; |
| }) |
| .always(function() { |
| $("#responseId").show(); |
| target.val("Checkout"); |
| target.css({ "background-image": "none" }); |
| }); |
| } |
| |
| function performGitPull(){ |
| $("#responseId").text(""); |
| if(!event) event = window.event; |
| var target = $(event.target); |
| target.val("Processing"); |
| target.css({ "background-image": "url('images/page-loading.gif')" }); |
| target.css({ "background-repeat": "no-repeat" }); |
| target.css({ "background-size": "25px 25px" }); |
| |
| var statusObj = document.getElementById("responseId"); |
| var urlVal = "/gitpull"; |
| $.get(urlVal) |
| .done(function( data ) { |
| var output = data.output; |
| if(output != null){ |
| output=output.replace(/\n/g,"<br>"); |
| statusObj.innerHTML = output; |
| } |
| }) |
| .fail(function(err) { |
| statusObj.innerText = "Failed to do git pull."; |
| }) |
| .always(function() { |
| $("#responseId").show(); |
| target.val("Pull"); |
| target.css({ "background-image": "none" }); |
| }); |
| } |
| |
| |
| function activateClickedTab(idVal) { |
| |
| $("#filter-tabs-dialog").dialog( "close" ); |
| var ul = $("#workspace-tabs"); |
| ul.children().each(function(){ |
| var li = $(this); |
| var link =li.find("a"); |
| var href = link.prop("href"); |
| var hrefId = href.split("#"); |
| if(hrefId[1] == idVal){ |
| link.trigger("click"); |
| } |
| }); |
| } |
| |
| function deleteOrRenameTab(idVal) { |
| $("#filter-tabs-dialog").dialog( "close" ); |
| var ul = $("#workspace-tabs"); |
| ul.children().each(function(){ |
| var li = $(this); |
| var link =li.find("a"); |
| var href = link.prop("href"); |
| var hrefId = href.split("#"); |
| if(hrefId[1] == idVal){ |
| link.trigger("click"); |
| link.trigger("dblclick"); |
| } |
| }); |
| } |
| |
| function deleteSelectedTab(idVal,title,_module,rpc,version){ |
| var dgInfo = "<div><table width='100%' border='1'><tr style='background-color:#65a9d7;color:white;' ><th>Tab Title</th><th>Module</th><th>RPC</th><th>Version</th></tr><tr style='background-color:white'><td>" + title + "</td><td>" + _module +"</td><td>" + rpc + "</td><td>" +version + "</td></tr></table></div><br>"; |
| var alertMsg = dgInfo + "<p>Are you sure you want to Delete this Tab ?</p>"; |
| |
| $( "#tabAlertDialog" ).dialog({ |
| dialogClass: "no-close", |
| modal:true, |
| draggable : true, |
| /*dialogClass: "alert",*/ |
| title: "Confirm Tab sheet Delete", |
| width: 600, |
| buttons: [ |
| { |
| text: "Delete", |
| class:"alertDialogButton", |
| click: function() { |
| var ws = RED.nodes.workspace(idVal); |
| RED.view.removeWorkspace(ws); |
| var historyEvent = RED.nodes.removeWorkspace(idVal); |
| historyEvent.t = 'delete'; |
| historyEvent.dirty = true; |
| historyEvent.workspaces = [ws]; |
| RED.history.push(historyEvent); |
| RED.view.dirty(true); |
| $( this ).dialog( "close" ); |
| $("#filter-tabs-dialog").dialog( "close" ); |
| $("#btn-manage-tabs").trigger("click"); |
| } |
| }, |
| { |
| text: "Cancel", |
| class:"alertDialogButton", |
| click: function() { |
| $( this ).dialog( "close" ); |
| } |
| } |
| ] |
| }).html(alertMsg); |
| } |
| |
| function renameSelectedTab(idVal,title,_module,rpc,version){ |
| var dgInfo = "<div><table width='100%' border='1'><tr style='background-color:#65a9d7;color:white;' ><th>Tab Title</th><th>Module</th><th>RPC</th><th>Version</th></tr><tr style='background-color:white'><td><input id='tab-name-" + idVal + "' type='text' value='" + title + "'></td><td>" + _module +"</td><td>" + rpc + "</td><td>" +version + "</td></tr></table></div><br>"; |
| var alertMsg = dgInfo + "<p>Change the title and click Rename.</p>"; |
| |
| $( "#tabAlertDialog" ).dialog({ |
| dialogClass: "no-close", |
| modal:true, |
| draggable : true, |
| /*dialogClass: "alert",*/ |
| title: "Rename Tab sheet", |
| width: 600, |
| buttons: [ |
| { |
| text: "Rename", |
| class:"alertDialogButton", |
| click: function() { |
| var ws = RED.nodes.workspace(idVal); |
| var label = document.getElementById("tab-name-" + idVal).value; |
| //console.log("label:" +label); |
| //console.log("ws.label:" + ws.label); |
| if (ws.label != label) { |
| ws.label = label; |
| var link = $("#workspace-tabs a[href='#"+idVal+"']"); |
| link.attr("title",label); |
| link.text(label); |
| RED.view.dirty(true); |
| } |
| $("#tabAlertDialog").dialog('destroy').remove(); |
| //$(this).dialog( "close" ); |
| $("#filter-tabs-dialog").dialog( "close" ); |
| $("#btn-manage-tabs").trigger("click"); |
| } |
| }, |
| { |
| text: "Cancel", |
| class:"alertDialogButton", |
| click: function() { |
| $( this ).dialog( "close" ); |
| } |
| } |
| ] |
| }).html(alertMsg); |
| } |
| |
| function performGitStatus(){ |
| $("#responseId").text(""); |
| if(!event) event = window.event; |
| var target = $(event.target); |
| target.val("Processing"); |
| target.css({ "background-image": "url('images/page-loading.gif')" }); |
| target.css({ "background-repeat": "no-repeat" }); |
| target.css({ "background-size": "25px 25px" }); |
| |
| var statusObj = document.getElementById("responseId"); |
| var urlVal = "/gitstatus"; |
| $.get(urlVal) |
| .done(function( data ) { |
| var output = data.output; |
| if(output != null){ |
| output=output.replace(/\n/g,"<br>"); |
| statusObj.innerHTML = output; |
| } |
| //statusObj.innerText = data.output; |
| }) |
| .fail(function(err) { |
| statusObj.innerText = "Failed to do git status."; |
| }) |
| .always(function() { |
| $("#responseId").show(); |
| target.val("Status"); |
| target.css({ "background-image": "none" }); |
| }); |
| } |
| |
| function migrateNodes(jsonStr){ |
| var nodes = JSON.parse(jsonStr); |
| nodes.forEach( function(node) { |
| if( node.xml != undefined && node.xml != null && node.xml.indexOf("<service-logic") != -1){ |
| //console.log(node.xml); |
| var module=""; |
| var version=""; |
| module=getAttributeValue(node.xml,"module"); |
| /* |
| var myRe = new RegExp("module=\"(.*)\" ", "m"); |
| var myArray = myRe.exec(node.xml); |
| if(myArray != null && myArray[1] != null){ |
| module=myArray[1]; |
| } |
| myRe = new RegExp("version=\"(.*)\">", "m"); |
| myArray = myRe.exec(node.xml); |
| if(myArray != null && myArray[1] != null){ |
| version=myArray[1]; |
| //console.dir(myArray); |
| } |
| */ |
| version=getAttributeValue(node.xml,"version"); |
| node.type="service-logic"; |
| //node.category="DGEmain"; |
| node.module=module; |
| node.version=version; |
| if(module != null && version != null){ |
| node.name=module+ " " + version; |
| } |
| console.log("module=" + module); |
| console.log("version=" + version); |
| }else if( node.xml != undefined && node.xml != null && node.xml.indexOf("<method") != -1){ |
| var rpc=getAttributeValue(node.xml,"rpc"); |
| node.type="method"; |
| if(rpc != null){ |
| node.name=rpc; |
| } |
| }else if(node.xml != undefined && node.xml != null && node.xml.indexOf("<outcome") != -1){ |
| var uxml = node.xml.toUpperCase(); |
| if(uxml.indexOf("FAILURE") != -1){ |
| node.type="failure"; |
| }else if(uxml.indexOf("SUCCESS") != -1){ |
| node.type="success"; |
| }else if(uxml.indexOf("TRUE") != -1){ |
| node.type="outcomeTrue"; |
| }else if(uxml.indexOf("FALSE") != -1){ |
| node.type="outcomeFalse"; |
| }else if(uxml.indexOf("ALREADY-ACTIVE") != -1){ |
| node.type="already-active"; |
| }else if(uxml.indexOf("NOT-FOUND") != -1){ |
| node.type="not-found"; |
| }else{ |
| node.type="other"; |
| } |
| }else if( node.xml != undefined &&node.xml != null && node.xml.indexOf("<return") != -1){ |
| var uxml = node.xml.toUpperCase(); |
| if(uxml.indexOf("FAILURE") != -1){ |
| node.type="returnFailure"; |
| }else if(uxml.indexOf("SUCCESS") != -1){ |
| node.type="returnSuccess"; |
| } |
| }else if(node.xml != undefined && node.xml != null && node.xml.indexOf("<exists") != -1){ |
| node.type="exists"; |
| }else if(node.xml != undefined && node.xml != null && node.xml.indexOf("<break") != -1){ |
| node.type="break"; |
| }else if(node.xml != undefined && node.xml != null && node.xml.indexOf("<block") != -1){ |
| node.type="block"; |
| var atomic=getAttributeValue(node.xml,"atomic"); |
| |
| if(atomic=='true'){ |
| node.atomic="true"; |
| node.name="block : atomic"; |
| }else{ |
| node.atomic="false"; |
| node.name="block"; |
| } |
| }else if(node.xml != undefined && node.xml != null && node.xml.indexOf("<save") != -1){ |
| node.type="save"; |
| }else if(node.xml != undefined && node.xml != null && node.xml.indexOf("<while") != -1){ |
| node.type="while"; |
| }else if(node.xml != undefined && node.xml != null && node.xml.indexOf("<switch") != -1){ |
| node.type="switchNode"; |
| }else if(node.xml != undefined && node.xml != null && node.xml.indexOf("<record") != -1){ |
| node.type="record"; |
| }else if(node.xml != undefined && node.xml != null && node.xml.indexOf("<call") != -1){ |
| node.type="call"; |
| }else if(node.xml != undefined && node.xml != null && node.xml.indexOf("<release") != -1){ |
| node.type="release"; |
| }else if(node.xml != undefined && node.xml != null && node.xml.indexOf("<set") != -1){ |
| node.type="set"; |
| }else if(node.xml != undefined && node.xml != null && node.xml.indexOf("<for") != -1){ |
| node.type="for"; |
| }else if(node.xml != undefined && node.xml != null && node.xml.indexOf("<is-available") != -1){ |
| node.type="is-available"; |
| }else if(node.xml != undefined && node.xml != null && node.xml.indexOf("<reserve") != -1){ |
| node.type="reserve"; |
| }else if(node.xml != undefined && node.xml != null && node.xml.indexOf("<get-resource") != -1){ |
| node.type="get-resource"; |
| }else if(node.xml != undefined && node.xml != null && node.xml.indexOf("<configure") != -1){ |
| node.type="configure"; |
| }else if(node.xml != undefined && node.xml != null && node.xml.indexOf("<delete") != -1){ |
| node.type="delete"; |
| }else if(node.xml != undefined && node.xml != null && node.xml.indexOf("<execute") != -1){ |
| node.type="execute"; |
| }else if(node.xml != undefined && node.xml != null && node.xml.indexOf("<notify") != -1){ |
| node.type="notify"; |
| }else if(node.xml != undefined && node.xml != null && node.xml.indexOf("<update") != -1){ |
| node.type="update"; |
| } |
| //console.dir(node); |
| }); |
| return nodes; |
| } |