diff options
author | Timoney, Daniel (dt5972) <dtimoney@att.com> | 2017-02-15 10:37:53 -0500 |
---|---|---|
committer | Timoney, Daniel (dt5972) <dtimoney@att.com> | 2017-02-15 10:40:37 -0500 |
commit | 324ee36fe31763e507b422ab0a88e4230045e205 (patch) | |
tree | d0b04520f6657601c918ce63fd27575977624187 /dgbuilder/public/util | |
parent | f0c97e8db427481e28c0a16b789bc73801b35e47 (diff) |
Initial commit for OpenECOMP SDN-C OA&M
Change-Id: I7ab579fd0d206bf356f36d52dcdf4f71f1fa2680
Signed-off-by: Timoney, Daniel (dt5972) <dtimoney@att.com>
Former-commit-id: 2a9f0edd09581f907e62ec4689b5ac94dd5382ba
Diffstat (limited to 'dgbuilder/public/util')
-rw-r--r-- | dgbuilder/public/util/css/validateNodeXml.css | 86 | ||||
-rw-r--r-- | dgbuilder/public/util/js/dgeToXml.js | 1328 | ||||
-rw-r--r-- | dgbuilder/public/util/js/dgeToXml.js.imp | 147 | ||||
-rw-r--r-- | dgbuilder/public/util/js/jsonTool.js | 67 | ||||
-rw-r--r-- | dgbuilder/public/util/js/migrateFlow.js | 184 | ||||
-rw-r--r-- | dgbuilder/public/util/js/sliValues.js | 763 | ||||
-rw-r--r-- | dgbuilder/public/util/js/validateNodeXml.js | 325 | ||||
-rw-r--r-- | dgbuilder/public/util/js/vkbeautify.0.99.00.beta.js | 358 |
8 files changed, 3258 insertions, 0 deletions
diff --git a/dgbuilder/public/util/css/validateNodeXml.css b/dgbuilder/public/util/css/validateNodeXml.css new file mode 100644 index 00000000..895ad7fd --- /dev/null +++ b/dgbuilder/public/util/css/validateNodeXml.css @@ -0,0 +1,86 @@ +#error-list-div{ +overflow:scroll; +color:brown; +width:480px; +height:300px; +} + +#node-validate-result a{ + text-decoration: underline; + color:blue; + cursor:pointer; +} + +table#errTable tr td:first-child { + border-left: 0px solid #e5e5e5; + text-align: center; +} + +table#errTable tr td:last-child { + border-right: 0px solid #e5e5e5; +} +table#errTable tr:nth-of-type(odd) { + background-color: #FFF0F0; +} + +table#errTable tr td { + border-width: 0px 0px 0px 0px; + border-style: solid; + border-color: #fff; + text-align: center; + font-size: 1.0em; +} + +#sli-values-div{ +overflow:auto; +color:blue; +width:850px; +height:600px; +} + +#sli-values-div input[type="text"] { + padding: 1px; + border: solid 1px grey; + /*border: solid 1px #dcdcdc;*/ + width:800px; + transition: box-shadow 0.3s, border 0.3s; + box-shadow: 0 0 5px 1px #969696; + cursor:pointer; +} + +.valueBoxDiv { + border-width: 1px 2px 1px 1px; + border-style: solid; + /*border-color: #9999FF;*/ + border-color: grey; + /*border-color: #fff;*/ + font-size: 1.0em; + border-left: 1px solid #fff; + border-right: 1px solid #fff; + border-top: 1px solid #fff; + border-bottom: 1px solid #fff; + padding-left: 5px; + padding-right: 5px; + padding-top: 5px; + padding-bottom: 5px; + /*background-color:#FFE6E6;*/ + background-color:#fff; +} + +/*#sli-values-div input[type="text"]:focus, + +#sli-values-div input[type="text"].focus { + border: solid 1px #707070; + box-shadow: 0 0 5px 1px #969696; +} +*/ +/* +#getFixed { + color: #c00; + font: bold 15px arial; + padding: 10px; + margin: 10px; + border: 1px solid #c00; + width: 200px; +} +*/ diff --git a/dgbuilder/public/util/js/dgeToXml.js b/dgbuilder/public/util/js/dgeToXml.js new file mode 100644 index 00000000..2bbb0c15 --- /dev/null +++ b/dgbuilder/public/util/js/dgeToXml.js @@ -0,0 +1,1328 @@ +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' ){ + 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); + 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 != ""){ + 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); + //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("<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("<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; +} diff --git a/dgbuilder/public/util/js/dgeToXml.js.imp b/dgbuilder/public/util/js/dgeToXml.js.imp new file mode 100644 index 00000000..199b1c6c --- /dev/null +++ b/dgbuilder/public/util/js/dgeToXml.js.imp @@ -0,0 +1,147 @@ +function getNodeToXml(){ + var nodeSet=[]; + 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)); + + function getDgStartNode(nodeList){ + for(var i=0;i<nodeList.length;i++){ + if(nodeList[i].type == 'dgstart'){ + return nodeList[i]; + } + } + return null; + } + 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; + } + + var dgstartNode = getDgStartNode(exportableNodeSet); + + var level=0; + var fullXmlStr=""; + + printXml(dgstartNode); + + + function printXml(node){ + var xmlStr=""; + var startTag = ""; + if(node != null && node.type != 'dgstart'){ + xmlStr=node.xml; + startTag = getStartTag(node); + 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 = []; + if(node != null && node.wires != null && node.wires[0] != null && node.wires[0] != undefined && node.wires[0].length >0 ){ + wiredNodes=node.wires[0]; + //sort based on y position + wiredNodes.sort(function(a, b){ + return a.y-b.y; + }); + } + + for(var k=0;wiredNodes != null && k<wiredNodes.length;k++){ + level++; + var nd = getNode(wiredNodes[k]); + printXml(nd); + } + + //append end tag + if(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); + + /* + for (var link in allLinks){ + var nd = RED.nodes.node(link); + console.dir(nd); + var obj = RED.nodes.getNodeSet(RED.view.getWorkspace()); + console.dir(obj); + } + */ + + + //console.dir(RED.nodes.getAllFlowNodes()); + //console.dir(RED.nodes.getType()); + /* + console.dir(RED.nodes.nodes); + RED.nodes.nodes.forEach(function (node){ + console.dir(node); + }); + */ + + /*var map = {68: false, 69: false, 86: false}; + $("#node-input-validate").keydown(function(e) { + if (e.keyCode in map) { + map[e.keyCode] = true; + if (map[68] && map[69] && map[86]) { + // FIRE EVENT + return "abcd"; + } + } + }).keyup(function(e) { + if (e.keyCode in map) { + map[e.keyCode] = false; + } + }); + */ + return fullXmlStr; +} diff --git a/dgbuilder/public/util/js/jsonTool.js b/dgbuilder/public/util/js/jsonTool.js new file mode 100644 index 00000000..f4d0de36 --- /dev/null +++ b/dgbuilder/public/util/js/jsonTool.js @@ -0,0 +1,67 @@ +var obj={}; +function dotToJson(str,value,obj){ + //var objArr = path.split("."), part; + var objArr = str.split("."); + var prevStr; + var currObj; + var prevObj; + console.log(str); + for(var i=0;i<objArr.length -1;i++){ + var subStr= objArr[i] ; + //console.log("subStr:" + subStr); + if(i==0 && obj[subStr] == undefined ){ + obj[subStr] = {}; + currObj= obj[subStr]; + }else if(i==0 && obj[subStr] != undefined ){ + currObj=obj[subStr]; + //console.log("in gkjgjkg"); + }else{ + if(i == 1){ + prevObj=obj[prevStr]; + if(prevObj[subStr] == undefined){ + prevObj[subStr] = {}; + currObj = prevObj[subStr]; + }else{ + currObj = prevObj[subStr]; + } + }else{ + if(prevObj[subStr] == undefined){ + prevObj[subStr] = {}; + currObj = prevObj[subStr]; + }else{ + currObj = prevObj[subStr]; + } + } + //console.dir(currObj); + } + prevStr=subStr; + if(i <objArr.length-2){ + prevObj=currObj; + } + } + var lastStr = objArr[objArr.length-1]; + currObj[lastStr] = value; + //prevObj[lastStr] = value; + //console.dir(currObj); + return obj; +} +n=dotToJson('abcfdfghdghdghdghdhdhd.efhfjhfjhfjhfjhfjhfjhfbg.hfjhfjhfjhfjhfjhfjh.l',"1234",obj); +//console.dir(n); +JSON.stringify(n,undefined,2); +m=dotToJson('abc.ebg.h.n',"5678",n); +console.dir(m); +function printObj(obj){ +for( j in obj){ + console.log(j + ":" + obj[j]); + if(typeof obj[j] == "object" ){ + printObj(obj[j]); + } + +} +} +printObj(m); +a=JSON.parse(JSON.stringify(m,null,2)); +console.dir(a); + + +//console.log (stringToObj('abc.ebg.h',"",{})); diff --git a/dgbuilder/public/util/js/migrateFlow.js b/dgbuilder/public/util/js/migrateFlow.js new file mode 100644 index 00000000..399db606 --- /dev/null +++ b/dgbuilder/public/util/js/migrateFlow.js @@ -0,0 +1,184 @@ +fs=require('fs'); +_=require('lodash'); +//extras=require("/home/users/schinthakayala/nodered/sheshi/dgxml/extras"); +//puts=extras.puts; +var path = require('path'); +var appDir = path.dirname(require.main.filename); + +var dgjson = []; +var level = 0; + +function getJSON() { +var filename = process.argv[2]; + console.log("reading json from flows file" + filename); + //flowsJson=fs.readFileSync(appDir + "/flows_ss4nj01dev01.localdomain.json").toString(); + flowsJson=fs.readFileSync(filename).toString(); + // Let's make a backup while we're here... + ts=Date.now().toString(); + flows=JSON.parse(flowsJson); + //console.log("returning flows"); + return(flows); +} + +function getStartTag(xmlStr){ + var startTag= 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){ + startTag = match[2]; + } + } + }catch(e){ + console.log(e); + } + return startTag; + +} + +function getAttributeValue(xmlStr,attribute){ + var attrVal=null; + try{ + var myRe = new RegExp(attribute + "=['\"](.*)['\"] ","m"); + var myArray = myRe.exec(xmlStr); + if(myArray != null && myArray[1] != null){ + attrVal=myArray[1]; + } + }catch(err){ + console.log(err); + } + return attrVal; +} + +function processNodes(){ + var nodes = getJSON(); + //console.dir(nodes); + + nodes.forEach( function(node) { + if( 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 != 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 != 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 != 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 != null && node.xml.indexOf("<exists") != -1){ + node.type="exists"; + }else if( 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 != null && node.xml.indexOf("<save") != -1){ + node.type="save"; + }else if( node.xml != null && node.xml.indexOf("<switch") != -1){ + node.type="switchNode"; + }else if( node.xml != null && node.xml.indexOf("<record") != -1){ + node.type="record"; + }else if( node.xml != null && node.xml.indexOf("<call") != -1){ + node.type="call"; + }else if( node.xml != null && node.xml.indexOf("<release") != -1){ + node.type="release"; + }else if( node.xml != null && node.xml.indexOf("<set") != -1){ + node.type="set"; + }else if( node.xml != null && node.xml.indexOf("<for") != -1){ + node.type="for"; + }else if( node.xml != null && node.xml.indexOf("<is-available") != -1){ + node.type="is-available"; + }else if( node.xml != null && node.xml.indexOf("<reserve") != -1){ + node.type="reserve"; + }else if( node.xml != null && node.xml.indexOf("<get-resource") != -1){ + node.type="get-resource"; + }else if( node.xml != null && node.xml.indexOf("<configure") != -1){ + node.type="configure"; + }else if( node.xml != null && node.xml.indexOf("<delete") != -1){ + node.type="delete"; + }else if( node.xml != null && node.xml.indexOf("<execute") != -1){ + node.type="execute"; + } + //console.dir(node); + }); +/* + var moduleName = "service-logic"; + var methodName = "method"; + for(var i=0;nodes != null && i<nodes.length;i++){ + if(nodes[i].type == "service-logic"){ + moduleName = nodes[i].name; + } + if(nodes[i].type == "method"){ + methodName = nodes[i].name; + } + } + var fName = moduleName + "_" + methodName + ".json"; + fName = fName.replace(/\s/g, "_"); + + var newFilename = process.argv[3]; + var filename = newFilename + "/" + fName; + console.log("filename" + filename); + fs.writeFileSync(filename, JSON.stringify(nodes,null,4)); + */ +} + + +processNodes(); diff --git a/dgbuilder/public/util/js/sliValues.js b/dgbuilder/public/util/js/sliValues.js new file mode 100644 index 00000000..eae10601 --- /dev/null +++ b/dgbuilder/public/util/js/sliValues.js @@ -0,0 +1,763 @@ +var global_editor ; +function addParam(idVal){ + //console.log(val); + //console.log(global_editor.getText()); + if(global_added_obj["a" + idVal] != undefined && global_added_obj["a" + idVal] != null){ + global_added_obj["a" + idVal]= global_added_obj["a" + idVal]+1; + $("#addCnt" + + idVal).text("added " + global_added_obj["a" + idVal] + " times"); + }else{ + global_added_obj["a" + idVal]= 1; + $("#addCnt" + + idVal).text("added " + global_added_obj["a" + idVal] + " time"); + } + var nameVal = document.getElementById("a" + idVal).value; + var valueBoxVal = document.getElementById("valbox" + idVal).value; + //$("#btn" + idVal).val('Added'); + //$("#btn" + idVal).attr('disabled','disabled'); + //console.dir(nameVal); + //console.dir(valueBoxVal); + + + var paramElement = "<parameter name='" + nameVal + "' value='" + valueBoxVal + "'/>\n"; + global_editor.setText(global_editor.getText() + paramElement); +} + +var g_currValuesObj={}; + +function filterValues(filterVal){ + global_added_obj={}; + var matchedCnt =0; + var valuesObj = g_currValuesObj; + var newValuesObj ={}; + var searchValues =[]; + if(filterVal != null && filterVal != undefined){ + filterVal=filterVal.trim(); + } + searchValues = filterVal.split(/ /); + //console.log("filterVal:" + filterVal); + if(searchValues != null && searchValues != undefined){ + for (var key in valuesObj) { + if (valuesObj.hasOwnProperty(key)) { + var newArrObj = []; + if(Array.isArray(valuesObj[key])){ + var arrObj=valuesObj[key]; + var cnt=1; + for(var i=0;i<arrObj.length;i++){ + var foundCount = 0; + for(var k=0;k<searchValues.length;k++){ + if(arrObj[i].indexOf(searchValues[k]) != -1){ + foundCount++; + } + } + if(foundCount == searchValues.length){ + matchedCnt++; + newArrObj.push(arrObj[i]); + } + } + newValuesObj[key] = newArrObj; + } + } + } + $("#matchedCntId").html(matchedCnt); + }else{ + newValuesObj = valuesObj; + } + var valuesHtml=buildValuesHtml(newValuesObj); + valuesHtml+="</div>"; + $("#sli-values-div").html(valuesHtml); +} + +function buildValuesHtml(valuesObj){ + var idCounter=0; + var htmlVal = ""; + + for (var key in valuesObj) { + if (valuesObj.hasOwnProperty(key)) { + var v = "<div style='font-weight:bold;font-size:1.0em;'><label>" + key + "<b/label>"; + if(Array.isArray(valuesObj[key])){ + var arrObj=valuesObj[key]; + var cnt=1; + for(var i=0;i<arrObj.length;i++){ + var idVal = idCounter++; + var addBtn = "<input id='btn" + idVal + "' type='button' style='background-color:#D6EBFF;' value='Add as Parameter'" + "onclick='addParam(\"" + idVal + "\")'><div style='float:right' id='addCnt" + idVal + "'></div>"; + var variableBox = ""; + var valBox = "<input id='valbox" + idVal + "' type='text' style='width:500px;height:30px;' value=''>"; + if(arrObj[i] != undefined && arrObj[i].length <150){ + //v += "<div style='width:1150px;background:aliceblue;border-color:aliceblue' class='valueBoxDiv' id='valueBoxDiv" + idVal + "'>" + "<input style='width:1125px;background:rgb(223, 191, 191);color:rgb(32, 45, 87);' type='text' readonly='1' id='a" + idVal + "' onclick='selectText(\"" + idVal+"\",\"" + key + "\")' value='" +arrObj[i] + "' title='" + arrObj[i] + "' >" ; + v += "<div style='width:1150px;background:aliceblue;border-color:aliceblue' class='valueBoxDiv' id='valueBoxDiv" + idVal + "'>" + "<input style='width:1125px;background:aliceblue;color:rgb(32, 45, 87);' type='text' readonly='1' id='a" + idVal + "' onclick='selectText(\"" + idVal+"\",\"" + key + "\")' value='" +arrObj[i] + "' title='" + arrObj[i] + "' >" ; + variableBox = "<input style='width:1125px' id='variableBox" + idVal + "' type='text' value='`$" + arrObj[i] + "`'>"; + }else{ + v+= "<div style='width:1150px;background:aliceblue;border-color:aliceblue' class='valueBoxDiv' id='valueBoxDiv" + idVal + "'>" + "<textarea style='width:1125px;background:aliceblue;color:rgb(32, 45, 87);' readonly='1' id='a" + idVal + "' onclick='selectText(\"" + idVal+"\",\"" + key + "\")' title='" + arrObj[i] + "' >" + arrObj[i] + "</textarea>"; + variableBox = "<textarea style='width:1125px' id='variableBox" + idVal + "' >`$" + arrObj[i] + "`'</textarea>"; + } + v += "<div id='valAddDiv" + idVal + "' style='display:none;'>" + valBox + " " + addBtn + "</div>" + + "<div id='variableBoxDiv" + idVal + "' style='display:none;color:rgb(32, 45, 87);'>Display as a variable<br>" + variableBox + "</div>" + "</div>"; + cnt++; + } + htmlVal+= v + "</div>"; + } + } + } + return htmlVal; +} + +function getModuleName(){ + var activeWorkspace=RED.view.getWorkspace(); + var moduleName=""; + RED.nodes.eachNode(function(n) { + if (n.z == activeWorkspace) { + if(n.type == 'service-logic'){ + //console.log("getModuleName():<" + n.module + ">"); + moduleName=n.module; + } + } + }); + return moduleName; +} +var global_added_obj={}; +var displayingRpcs = false; +function showRpcsValuesBox(editor,valuesObj){ + displayingRpcs = true; + showValuesBox(editor,valuesObj); +} + +function showValuesBox(editor,valuesObj){ + var moduleName = getModuleName(); + var obj = valuesObj[moduleName]; + //console.dir(valuesObj); + //console.dir(obj); + var moduleObj ={}; + if(obj == undefined){ + moduleObj[moduleName] = ["No SLI values setup for this module " + moduleName + ".Upload the yang file for this module or if already uploaded ,load it from the Available Modules from the Menu."]; + }else{ + moduleObj[moduleName] = obj; + } + showValuesBoxForModule(editor,moduleObj,moduleName); +} + +function showValuesBoxForModule(editor,valuesObj,moduleName){ + global_editor=editor; + g_currValuesObj = valuesObj; + //console.log(editor.getText()); + //populate the valid SLI values + var valuesHtml="<style>.color-dialog {background:aliceblue;border-color:lightgrey;border-width:3px;border-style:solid; }</style><div style='float:left;width:1200px;background:aliceblue'><input style='width:1125px' id='filter-id' type='text' value='' placeholder='To filter the values type words seperated by space in this box' onkeyup='filterValues(this.value)'></div><div style='float:left;color:green;font-size:0.8em' id='matchedCntId'></div><div style='clear:both'></div><div id='sli-values-div' style='width:1200px;'>" ; + valuesHtml+=buildValuesHtml(valuesObj); + valuesHtml+="</div>"; + global_added_obj={}; + + + var title = "SLI Values for Module " + moduleName; + if(displayingRpcs){ + title = "RPCs for Module " + moduleName; + } + $('#sli-values-dialog').dialog({ + modal: false, + title: title, + width: 1200, + height: 500, + dialogClass: 'color-dialog', + open: function () { + $("#sli-values-dialog").dialog("widget").find(".ui-dialog-buttonpane").css({'background': 'aliceblue'}); + $(this).html(valuesHtml); + }, + buttons: { + Close: function () { + displayingRpcs = false; + //$(this).dialog("close"); + $(this).dialog("destroy"); + } + }, + close: function(ev,ui){ + displayingRpcs = false; + $(this).dialog("destroy"); + } + }); // end dialog div +} + +function showCommentsBox(){ + var comments = $("#node-input-comments").val(); + var commentsBoxHtml="<div><textarea style='font-size:18px;height:150px;width:390px;' id='taCommentId'>" + comments + "</textarea></div>" ; + + var nodeName=$("#node-input-name").val(); + $('#comments-dialog').dialog({ + modal: true, + title: "Add comments for Node " + nodeName, + width: 450, + height: 300, + /* + open: function () { + $(this).html(commentsBoxHtml); + }, + */ + buttons: { + "Save Comments": function () { + var v=$("#taCommentId").val(); + if(v != null){ + v = v.trim(); + if(v != ''){ + $("#node-input-btnComments").html("<span style='color:blue;'><b>View Comments</b></span>"); + }else{ + $("#node-input-btnComments").html("<b>Add Comments</b>"); + } + } + //console.log("value from text area" + v); + $("#node-input-comments").val(v); + $(this).dialog("close"); + //$(this).dialog("destroy"); + }, + Cancel: function () { + var v=$("#taCommentId").val(); + if(v != null){ + v = v.trim(); + if(v != ''){ + $("#node-input-btnComments").html("<span style='color:blue;'><b>View Comments</b></span>"); + }else{ + $("#node-input-btnComments").html("<b>Add Comments</b>"); + } + } + $(this).dialog("close"); + //$(this).dialog("destroy"); + } + }, + close: function(ev,ui){ + //console.log("closing.."); + $(this).dialog("destroy"); + } + }).html(commentsBoxHtml); + + //console.log("done"); +/* + function functionDialogResize(ev,ui) { + console.log("ui.size.height:" + ui.size.height); + $(this).css("height",(ui.size.height-275)+"px"); + }; + + $( this ).on("dialogresize", functionDialogResize); + + + $( this ).one("dialogopen", function(ev) { + var size = $( "#sliValDiv" ).dialog('option','sizeCache-function'); + if (size) { + functionDialogResize(null,{size:size}); + } + }); +*/ + +} + +function selectText(objId,groupVal){ + //console.log(objId + groupVal); + //console.log(objId + groupVal); + $(document).ready(function(){ + //console.log("doc ready"); + //console.dir($('#valAddDiv' + objId)); + if ($('#valAddDiv' + objId).is(":visible")) { + $("#variableBoxDiv" + objId ).hide("slow"); + //$("#a" + objId ).css({"background": "rgb(223, 191, 191)", + // "color": "rgb(32, 45, 87)"}); + $("#a" + objId ).css({"background": "aliceblue", + "color": "rgb(32, 45, 87)"}); + /*"color": "rgb(32, 45, 87)"});*/ + $("#valAddDiv" + objId ).hide("slow"); + $("#valueBoxDiv" +objId).css({"border-color": "aliceblue", + "border-width":"1px", + "background-color":"aliceblue", + "border-style":"solid"}); + //$("#valAddDiv" + objId ).fadeOut("slow"); + } else{ + $("#variableBoxDiv" + objId ).show("slow"); + $("#valAddDiv" + objId).show("slow"); + /*$("#valueBoxDiv" +objId).css({"border-color": "rgb(75, 111, 147)", + "border-width":"5px", + "background-color": "rgb(223, 191, 191)", + "border-style":"solid", + "border-bottom": "5px solid rgb(75, 111, 147)"}); + */ + $("#valueBoxDiv" +objId).css({"border-color": "rgb(75, 111, 147)", + "border-width":"3px", + "background-color": "aliceblue", + "border-style":"solid", + "border-bottom": "3px solid rgb(75, 111, 147)"}); + /*$("#a" + objId ).css({"background": "rgb(223, 191, 191)", + "color": "rgb(75, 111, 147)"}); + */ + $("#a" + objId ).css({"background": "aliceblue", + "color": "rgb(75, 111, 147)"}); + } + $("#a" + objId).select(); + }); + //console.log("group-heading" + objId); +// var obj= document.getElementById("group-heading" + objId); +// obj.innerText = groupVal; +// obj.style.color = "blue"; +// console.dir(obj); +} + +function hidePrevGroup(objId){ +// console.log("mouseout" ); +// var obj= document.getElementById("group-heading" + objId); +// obj.innerText = ""; +} +/* +function fixDiv() { + var $cache = $('#getFixed'); + if ($(window).scrollTop() > 100) + $cache.css({ + 'position': 'fixed', + 'top': '10px' + }); + else + $cache.css({ + 'position': 'relative', + 'top': 'auto' + }); + } + +$(window).scroll(fixDiv); + +function isScrolledIntoView(elem) +{ + var $elem = $(elem); + var $window = $(window); + + var docViewTop = $window.scrollTop(); + var docViewBottom = docViewTop + $window.height(); + + var elemTop = $elem.offset().top; + var elemBottom = elemTop + $elem.height(); + + return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop)); +} +*/ + +function getCommits(filePath){ +var urlPath="/getCommitsInfo"; +$.get(urlPath,{"filePath" : filePath }) + .done(function( data ) { + if(data != undefined && data != null){ + //console.log(data.stdout); + var jsonObj = JSON.parse(data.stdout); + var codeCloudFilesHtmlStr = $( "#codecloud-browser-dialog" ).html(); + var htmlStr = getCCFileHtmlStr(filePath,jsonObj,codeCloudFilesHtmlStr); + $( "#codecloud-browser-dialog" ).html(htmlStr); + /* + for(var i=0;i<jsonObj.length;i++){ + console.log("commit:" + jsonObj[i].commit); + console.log("date:" + jsonObj[i].date); + console.log("author:" + jsonObj[i].author); + console.log("comment:" + jsonObj[i].comment); + } + */ + } + }) + .fail(function(err) { + }) + .always(function() { + }); +} + + +function getCCFileHtmlStr(filePath,rows,codeCloudFilesHtmlStr){ + var styleStr = "<style> " + + "table#cct01 { width:100%; } \n" + + "table#cct01 th,table#cct01 td { border: 1px solid black; border-collapse: collapse; } \n" + + "table#cct01 th,table#cct01 td { padding: 5px; text-align: left; } \n" + + "table#cct01 tr:nth-child(even) { background-color: #eee; }\n" + + "table#cct01 tr:nth-child(odd) { background-color:#fff; }\n" + + "table#cct01 th { background-color: #65a9d7; color: white; }\n" + + "table#cct01 a { color: #337ab7; }\n" + + "table#cct01 a:link { color: #65a9d7; }\n" + + "table#cct01 a:visited { color: #636; }\n" + + "table#cct01 a:hover { color: #3366CC; cursor: pointer }\n" + + "table#cct01 a:active { color: #65a9d7 }\n" + + "table#cct01 caption { display: table-caption; text-align: center; background: #eee; font-weight: bold; font-size: 1.1em; border: 1px solid black; }\n" + + "</style>"; + var htmlStr=""; + //console.dir(rows); + if(rows != null && rows.length >0){ + var alertDialog = '<div id="ccAlertdialog"></div>'; + htmlStr= alertDialog + "<div style='width:1050;height:650'>" + styleStr; + htmlStr += "<table id='cct01' >"; + htmlStr += "<caption id='ccCaptionId'>" + filePath + "</caption>"; + htmlStr += "<tr>"; + htmlStr += "<th>Commit ID</th>" ; + htmlStr += "<th>Date</th>" ; + htmlStr += "<th>Author</th>" ; + htmlStr += "<th>Comment</th>" ; + htmlStr += "</tr>"; + if(rows != null && rows.length == 0){ + htmlStr += "<tr>"; + htmlStr += "<td><b>No rows found</b></td>"; + htmlStr += "</tr></table></div>"; + return htmlStr; + } + for(var i=0;i<rows.length;i++){ + var row = rows[i]; + var _commitId = row.commit; + var dt = row.date; + var author = row.author; + var comment = row.comment; + htmlStr += "<tr>"; + htmlStr += "<td><a onclick=\"javascript:importCCFlow('" + _commitId + "','" + filePath + "')\">" + _commitId + "</a></td>"; + htmlStr += "<td>" + dt + "</td>"; + htmlStr += "<td>" + author + "</td>"; + htmlStr += "<td>" + comment + "</td>"; + htmlStr += "</tr>"; + } + htmlStr += "</table>"; + htmlStr += "</div>"; + } + //console.log(htmlStr); + return htmlStr; +} + + +var gitLocalFlowFiles=[]; +function filterGitLocalFlows(filterVal){ + + var matchedCnt =0; + var valuesObj = gitLocalFlowFiles; + //console.dir(codeCloudFlowFiles); + var updatedValuesObj =[]; + var searchValues =[]; + if(filterVal != null && filterVal != undefined){ + filterVal=filterVal.trim(); + } + searchValues = filterVal.split(/ /); + //console.log("filterVal:" + filterVal); + //console.dir(searchValues); + if(searchValues != null && searchValues != undefined){ + var foundCount = 0; + for(var k=0;k<searchValues.length;k++){ + if(foundCount >0){ + valuesObj=updatedValuesObj; + } + updatedValuesObj=[]; + for(var i=0;i<valuesObj.length;i++){ + var patt = new RegExp(searchValues[k],"gi"); + if(patt.test(valuesObj[i])){ + foundCount++; + updatedValuesObj.push(valuesObj[i]); + } + } + } + }else{ + updatedValuesObj = valuesObj; + } + //console.dir(updatedValuesObj); + var html="<ul>"; + if(updatedValuesObj != null){ + var files=updatedValuesObj; + //console.dir(files); + files.sort(function (a,b){ + if(a > b){ + return 1; + }else if(a < b){ + return -1; + }else{ + return 0; + } + }); + for(var i=0;files != null && i<files.length;i++){ + html+="<li><a href=\"#\" onclick=\"importGitLocalFlow('" + files[i] + "')\">" + files[i] + "</a></li>"; + } + } + html+="</ul>"; + html+="</div>"; + $( "#gitlocal-data-container" ).html(html); +} + +var codeCloudFlowFiles=[]; +function filterFlows(filterVal){ + + var matchedCnt =0; + var valuesObj = codeCloudFlowFiles; + //console.dir(codeCloudFlowFiles); + var updatedValuesObj =[]; + var searchValues =[]; + if(filterVal != null && filterVal != undefined){ + filterVal=filterVal.trim(); + } + searchValues = filterVal.split(/ /); + //console.log("filterVal:" + filterVal); + //console.dir(searchValues); + if(searchValues != null && searchValues != undefined){ + var foundCount = 0; + for(var k=0;k<searchValues.length;k++){ + for(var i=0;i<valuesObj.length;i++){ + var patt = new RegExp(searchValues[k],"gi"); + if(patt.test(valuesObj[i])){ + foundCount++; + updatedValuesObj.push(valuesObj[i]); + } + } + } + }else{ + updatedValuesObj = valuesObj; + } + //console.dir(updatedValuesObj); + var html="<ul>"; + if(updatedValuesObj != null){ + var files=updatedValuesObj; + //console.dir(files); + files.sort(function (a,b){ + if(a > b){ + return 1; + }else if(a < b){ + return -1; + }else{ + return 0; + } + }); + for(var i=0;files != null && i<files.length;i++){ + html+="<li><a href=\"#\" onclick=\"getCommits('" + files[i] + "')\">" + files[i] + "</a></li>"; + } + } + html+="</ul>"; + html+="</div>"; + $( "#codecloud-data-container" ).html(html); +} + +var yangFilesList=[]; +/* +function filterYangFiles(filterVal){ + + var matchedCnt =0; + var valuesObj = yangFilesList; + var updatedValuesObj =[]; + var searchValues =[]; + if(filterVal != null && filterVal != undefined){ + filterVal=filterVal.trim(); + } + searchValues = filterVal.split(/ /); + if(searchValues != null && searchValues != undefined){ + var foundCount = 0; + for(var k=0;k<searchValues.length;k++){ + for(var i=0;i<valuesObj.length;i++){ + var patt = new RegExp(searchValues[k],"gi"); + if(patt.test(valuesObj[i])){ + foundCount++; + updatedValuesObj.push(valuesObj[i]); + } + } + } + }else{ + updatedValuesObj = valuesObj; + } + //console.dir(updatedValuesObj); + var html="<ul>"; + if(updatedValuesObj != null){ + var files=updatedValuesObj; + //console.dir(files); + files.sort(function (a,b){ + if(a > b){ + return 1; + }else if(a < b){ + return -1; + }else{ + return 0; + } + }); + for(var i=0;files != null && i<files.length;i++){ + html+="<li><a href=\"#\" onclick=\"getYangFile('" + files[i] + "')\">" + files[i] + "</a></li>"; + } + } + html+="</ul>"; + html+="</div>"; + $( "#list-yang-data-container" ).html(html); +} +*/ + +function filterYangFiles(filterVal){ + var matchedCnt =0; + var valuesObj = yangFilesList; + var updatedValuesObj =[]; + var searchValues =[]; + if(filterVal != null && filterVal != undefined){ + filterVal=filterVal.trim(); + } + searchValues = filterVal.split(/ /); + if(searchValues != null && searchValues != undefined){ + var foundCount = 0; + for(var k=0;k<searchValues.length;k++){ + for(var i=0;i<valuesObj.length;i++){ + var patt = new RegExp(searchValues[k],"gi"); + if(patt.test(valuesObj[i])){ + foundCount++; + updatedValuesObj.push(valuesObj[i]); + } + } + } + }else{ + updatedValuesObj = valuesObj; + } + //console.dir(updatedValuesObj); + var html="<table id='yang-file-list-table' border=1>"; + html+="<tr>"; + html+="<th>File</th>"; + html+="<th>Delete</th>"; + html+="</tr>"; + + if(updatedValuesObj != null){ + var files=updatedValuesObj; + //console.dir(files); + files.sort(function (a,b){ + if(a > b){ + return 1; + }else if(a < b){ + return -1; + }else{ + return 0; + } + }); + for(var i=0;files != null && i<files.length;i++){ + html+="<tr><td><a href=\"#\" onclick=\"getYangFile('" + files[i] + "')\">" + files[i] + "</a></td><td>" + "<input type='button' onclick='deleteYangFile(\"" + files[i] + "\")' value='Delete'></td></td></td></tr>"; + } + } + html+="</table>"; + html+="</div>"; + + $( "#yang-files-data-container" ).html(html); +} + +function getYangFile(fileName){ + $("#dwnldYangFormId").remove(); + //using form to submit + var form = $('<form id="dwnldYangFormId" method="POST" action="/downloadYang"></form>'); + form.append('<input type="hidden" name="fileName" value="' + fileName + '"/>'); + form.appendTo('body'); + $("#dwnldYangFormId").submit(); + +} +function deleteYangFile(fileName){ + var reqData= {"fileName":fileName}; + $.post( "/deleteYangFile",reqData ) + .done(function( data ) { + }) + .fail(function(err) { + console.log( "error" + err ); + }) + .always(function() { + $("#list-yang-browser-dialog").dialog("close"); + $("#btn-list-yang-files").trigger("click"); + }); +} + +function importCCFlow(commitId,filePath){ +var urlPath="/importCodeCloudFlow"; +$.get(urlPath,{"commitId" : commitId,"filePath" : filePath }) + .done(function( data ) { + if(data != undefined && data != null){ + //console.log(data.stdout); + var jsonObj = JSON.parse(data.stdout); + $( "#codecloud-browser-dialog" ).dialog("close"); + RED.view.importNodes(JSON.stringify(jsonObj)); + } + }) + .fail(function(err) { + RED.notify("Could not import flow from code cloud."); + $( "#codecloud-browser-dialog").dialog("close"); + console.log( "error occured importing flow."); + }) + .always(function() { + }); +} + +function importGitLocalFlow(filePath){ +var urlPath="/importGitLocalFlow"; +$.get(urlPath,{"filePath" : filePath }) + .done(function( data ) { + if(data != undefined && data != null){ + //console.log(data.stdout); + var jsonObj; + try{ + jsonObj = JSON.parse(data.stdout); + $( "#gitlocal-browser-dialog" ).dialog("close"); + RED.view.importNodes(JSON.stringify(jsonObj)); + }catch(err){ + RED.notify("Could not import flow from Local Git Repository."); + $( "#gitlocal-browser-dialog").dialog("close"); + console.log( "error occured importing flow." + err); + } + }else{ + RED.notify("Could not import flow from Local Git Repository."); + $( "#gitlocal-browser-dialog").dialog("close"); + console.log( "error occured importing flow." + err); + } + }) + .fail(function(err) { + RED.notify("Could not import flow from Local Git Repository."); + $( "#gitlocal-browser-dialog").dialog("close"); + console.log( "error occured importing flow."); + }) + .always(function() { + }); +} + +var availableYangModules=[]; +function filterYangModules(filterVal){ + + var matchedCnt =0; + var valuesObj = availableYangModules ; + //console.dir(codeCloudFlowFiles); + var updatedValuesObj =[]; + var searchValues =[]; + if(filterVal != null && filterVal != undefined){ + filterVal=filterVal.trim(); + } + searchValues = filterVal.split(/ /); + //console.log("filterVal:" + filterVal); + //console.dir(searchValues); + if(searchValues != null && searchValues != undefined){ + var foundCount = 0; + for(var k=0;k<searchValues.length;k++){ + if(foundCount >0){ + valuesObj=updatedValuesObj; + } + updatedValuesObj=[]; + for(var i=0;i<valuesObj.length;i++){ + var patt = new RegExp(searchValues[k],"gi"); + if(patt.test(valuesObj[i])){ + foundCount++; + updatedValuesObj.push(valuesObj[i]); + } + } + } + }else{ + updatedValuesObj = valuesObj; + } + //console.dir(updatedValuesObj); + var html=""; + html+="<table border=1>"; + html+="<tr>"; + html+="<th>#</th>"; + html+="<th>Load</th>"; + html+="<th>Module</th>"; + html+="</tr>"; + + if(updatedValuesObj != null){ + var files=updatedValuesObj; + //console.dir(files); + files.sort(function (a,b){ + if(a > b){ + return 1; + }else if(a < b){ + return -1; + }else{ + return 0; + } + }); + var count=1; + for(var i=0;files != null && i<files.length;i++){ + var val = files[i].replace(/:.*/,""); + if(files[i].indexOf(":checked") != -1){ + html+="<tr><td>" + count + "</td><td><input type='checkbox' checked value='" + val + "'></td><td>" + val + "</td></tr>"; + }else{ + html+="<tr><td>" + count + "</td><td><input type='checkbox' value='" + val + "'></td><td>" + val + "</td></tr>"; + } + count++; + } + } + html+="</table>"; + html+="</div>"; + $( "#yang-modules-data-container" ).html(html); +} diff --git a/dgbuilder/public/util/js/validateNodeXml.js b/dgbuilder/public/util/js/validateNodeXml.js new file mode 100644 index 00000000..2291d865 --- /dev/null +++ b/dgbuilder/public/util/js/validateNodeXml.js @@ -0,0 +1,325 @@ +function resetStatus(){ + showMsg("","green"); +} + +function showMsg(msg,color){ + $("#node-validate-result").html(msg); + $("#node-validate-result") + .css('color', '') + .css('color', color); +} + +function getAttributeValue(xmlStr,attribute){ + + var attrVal=null; + try{ + if(xmlStr != null){ + 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; +} + + +var resp = true; +var processedNode = ""; +var errList=[]; +var elementCount=0; +function processNode(xmlNode){ + if(xmlNode == null) return; + if(xmlNode.nodeName != "parsererror" && xmlNode.nodeName != "#text"){ + processedNode = xmlNode.nodeName; + } + //console.log("processedNode:" + processedNode); + switch(xmlNode.nodeType){ + case 1: + elementCount++; + //ELEMENT_NODE + //console.log(xmlNode.nodeName); + //console.dir(xmlNode.nodeName); + if(xmlNode.nodeName == "parsererror"){ + //var nearNode = xmlNode.previousSibling != null ?xmlNode.previousSibling.nodeName : xmlNode.parentNode.nodeName; + console.log("Error parsing xml after node " + processedNode); + var msg = "error parsing XML after element <" + processedNode + "> Element#" + elementCount; + errList.push(msg); + resp = false; + return; + } + processedNode = xmlNode.nodeName; + var attrs = xmlNode.attributes; + for(var i=0;i<attrs.length;i++){ + //console.log("Attribute:" + attrs[i].nodeName); + //console.log("Value:" + attrs[i].value); + if(attrs[i].nodeName != "value" && attrs[i].value == ""){ + var msg=""; + /* + var prevSibling = xmlNode.previousSibling; + if(prevSibling != null && prevSibling != undefined){ + msg = "element <" + xmlNode.nodeName + "> attribute '" + attrs[i].nodeName + "' is not set. Element#" + elementCount; + }else{ + msg = "element <" + xmlNode.nodeName + "> attribute '" + attrs[i].nodeName + "' is not set. Element#" + elementCount; + } + */ + msg = "element <" + xmlNode.nodeName + "> attribute '" + attrs[i].nodeName + "' is not set. Element#" + elementCount; + errList.push(msg); + //console.log("element <" + xmlNode.nodeName + "> attribute '" + attrs[i].nodeName + "' is not set.Element#" + elementCount); + resp = false; + } + } + var childNodes = xmlNode.childNodes; + for(var k=0;k<childNodes.length;k++){ + processNode(childNodes[k]); + } + break; + case 2: + //ATTRIBUTE_NODE + //console.log(xmlNode.nodeName); + break; + case 3: + //TEXT_NODE + //console.log(xmlNode.nodeValue); + break; + case 4: + //CDATA_SECTION_NODE + console.log("CDATA_SECTION_NODE"); + break; + case 5: + //ENTITY_REFERENCE_NODE + console.log("ENTITY_REFERENCE_NODE"); + break; + case 6: + //ENTITY_NODE + console.log("ENTITY_NODE"); + break; + case 7: + //PROCESSING_INSTRUCTION_NODE + console.log("PROCESSING_INSTRUCTION_NODE"); + break; + case 8: + //COMMENT_NODE + console.log("COMMENT_NODE"); + break; + case 9: + //DOCUMENT_NODE + console.log("DOCUMENT_NODE"); + break; + case 10: + //DOCUMENT_TYPE_NODE + console.log("DOCUMENT_TYPE_NODE"); + break; + case 11: + //DOCUMENT_TYPE_NODE + console.log("DOCUMENT_FRAGMENT_NODE"); + break; + case 12: + //NOTATION_NODE + console.log("DOCUMENT_FRAGMENT_NODE"); + break; + } +} + +function validateFinalXML(xmlStr){ + + //console.dir(RED); + processedNode=""; + resp=true; + errList=[]; + elementCount=0; + //console.log("In validateXML xmlStr:" + xmlStr); + if(xmlStr == null || xmlStr == "") return true; + xmlStr = xmlStr.trim(); + try{ + 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("Error parsing" +e); + return false; + } + }else{ + try{ + //console.log("IE"); + // code for IE + xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); + xmlDoc.async=false; + xmlDoc.loadXMLString(xmlStr); + }catch(e){ + console.log("Error parsing" +e); + return false; + } + } + + //console.dir(xmlDoc); + processNode(xmlDoc.documentElement); + + if(resp){ + console.log("Validation Successful"); + RED.notify("<strong>XML validation</strong>: SUCCESS","success"); + }else{ + console.log("Errors found. "); + RED.notify("<strong>XML validation</strong>: FAILED","error"); + } + }catch(e){ + console.log("error:" +e); + RED.notify("<strong>XML validation</strong>: FAILED","error"); + resp=false; + return resp; + } + return resp; +} + +function validateXML(xmlStr){ + + //console.dir(RED); + processedNode=""; + resp=true; + errList=[]; + elementCount=0; + //console.log("In validateXML xmlStr:" + xmlStr); + //var xmlStr = $("#node-input-xml-editor").text(); + if(xmlStr == null || xmlStr == undefined){ + xmlStr = $("#node-input-xml-editor").text(); + } + if(xmlStr == undefined) return false; + //console.dir($("#node-input-xml-editor")); + //console.log("xmlStr:" + xmlStr); + xmlStr = xmlStr.trim(); + var startTag ; + var endTag ; + try{ + var re = /^[0-9]+/; + xmlStr = xmlStr.replace(re,''); + var regex = /(<)([\w-]+)(.*)?/; + var match = regex.exec(xmlStr); + if(match != null){ + if(match[1] != undefined && match[2] != undefined){ + startTag = match[2]; + } + }else{ + resp=false; + showMsg("startTag not found.","red"); + return resp; + } + }catch(e){ + console.log(e); + return false; + } + //console.log(xmlStr); + if(xmlStr == ""){ + resp=false; + showMsg("XML not found","red"); + return resp; + } + endTag = "</" + startTag + ">"; + + if(xmlStr.indexOf(endTag) != -1){ + resp=false; + showMsg("Error: End tag </" + startTag + "> must not be included.","red"); + console.log("End tag " + endTag + " must not be included."); + return resp; + } + try{ + //var xmlTopStr = "<?xml version='1.0' encoding='UTF-8'?>\n" ; + //xmlStr = xmlTopStr + xmlStr; + //xmlStr = xmlStr.replace(/'/g,"\""); + xmlStr+= "\n" + endTag; + xmlStr = xmlStr.trim(); + //console.log("xmlStr:" + xmlStr); + 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; + showMsg("Error parsing","red"); + console.log("Error parsing"); + return resp; + } + }catch(e){ + console.log("Error parsing" +e); + return false; + } + }else{ + try{ + //console.log("IE"); + // code for IE + xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); + xmlDoc.async=false; + xmlDoc.loadXMLString(xmlStr); + }catch(e){ + console.log("Error parsing" +e); + return false; + } + } + + //console.dir(xmlDoc); + processNode(xmlDoc.documentElement); + if(resp){ + showMsg("Validation Successful","green"); + }else{ + showMsg("Errors found. <a onclick='javascript:showErrors()'>show errors</a>","red"); + console.log("Errors found. "); + } + }catch(e){ + console.log("error:" +e); + showMsg(e,"red"); + resp=false; + return resp; + } + return resp; +} + +function showErrors() { + //var sourceField = event != null ?event.srcElement:event.target; + //console.dir(sourceField); + //sourceField.style.backgroundColor="skyblue"; + //var leftVal = event.target.offsetLeft ; + //alert(topVal + ":" + leftVal); + /*left:leftVal,*/ + //var pos = event.target; + //var topVal = event.target.offsetTop + topPosition ; + //var topVal = event.target.offsetTop +75; + var htmlStr="<div id='error-list-div'><table id='errTable' border='1'><tr><th>Error List</th></tr>"; + for(var i=0;errList != null && i<errList.length;i++){ + var errSeq = i+1; + htmlStr += "<tr><td>" + errSeq + ")" + errList[i] + "</td></tr>"; + } + htmlStr += "</table></div>"; + //var prevHtml = $("#tab-info").html(); + //htmlStr += "<input type='button' value='Hide Errors' onclick=\"closeShowErrors('" + prevHtml + "')\" >"; + //$('#show-errors-div').html(htmlStr); + //$("#tab-info").html(prevHtml + htmlStr); + + //$('<div></div>').dialog({ + $('#show-errors-dialog').dialog({ + modal: true, + title: "XML Error List ", + width: 500, + open: function () { + $(this).html(htmlStr); + }, + buttons: { + Close: function () { + $(this).dialog("close"); + } + } + }); // end dialog div +} diff --git a/dgbuilder/public/util/js/vkbeautify.0.99.00.beta.js b/dgbuilder/public/util/js/vkbeautify.0.99.00.beta.js new file mode 100644 index 00000000..13cee3a5 --- /dev/null +++ b/dgbuilder/public/util/js/vkbeautify.0.99.00.beta.js @@ -0,0 +1,358 @@ +/** +* vkBeautify - javascript plugin to pretty-print or minify text in XML, JSON, CSS and SQL formats. +* +* Version - 0.99.00.beta +* Copyright (c) 2012 Vadim Kiryukhin +* vkiryukhin @ gmail.com +* http://www.eslinstructor.net/vkbeautify/ +* +* Dual licensed under the MIT and GPL licenses: +* http://www.opensource.org/licenses/mit-license.php +* http://www.gnu.org/licenses/gpl.html +* +* Pretty print +* +* vkbeautify.xml(text [,indent_pattern]); +* vkbeautify.json(text [,indent_pattern]); +* vkbeautify.css(text [,indent_pattern]); +* vkbeautify.sql(text [,indent_pattern]); +* +* @text - String; text to beatufy; +* @indent_pattern - Integer | String; +* Integer: number of white spaces; +* String: character string to visualize indentation ( can also be a set of white spaces ) +* Minify +* +* vkbeautify.xmlmin(text [,preserve_comments]); +* vkbeautify.jsonmin(text); +* vkbeautify.cssmin(text [,preserve_comments]); +* vkbeautify.sqlmin(text); +* +* @text - String; text to minify; +* @preserve_comments - Bool; [optional]; +* Set this flag to true to prevent removing comments from @text ( minxml and mincss functions only. ) +* +* Examples: +* vkbeautify.xml(text); // pretty print XML +* vkbeautify.json(text, 4 ); // pretty print JSON +* vkbeautify.css(text, '. . . .'); // pretty print CSS +* vkbeautify.sql(text, '----'); // pretty print SQL +* +* vkbeautify.xmlmin(text, true);// minify XML, preserve comments +* vkbeautify.jsonmin(text);// minify JSON +* vkbeautify.cssmin(text);// minify CSS, remove comments ( default ) +* vkbeautify.sqlmin(text);// minify SQL +* +*/ + +(function() { + +function createShiftArr(step) { + + var space = ' '; + + if ( isNaN(parseInt(step)) ) { // argument is string + space = step; + } else { // argument is integer + switch(step) { + case 1: space = ' '; break; + case 2: space = ' '; break; + case 3: space = ' '; break; + case 4: space = ' '; break; + case 5: space = ' '; break; + case 6: space = ' '; break; + case 7: space = ' '; break; + case 8: space = ' '; break; + case 9: space = ' '; break; + case 10: space = ' '; break; + case 11: space = ' '; break; + case 12: space = ' '; break; + } + } + + var shift = ['\n']; // array of shifts + for(ix=0;ix<100;ix++){ + shift.push(shift[ix]+space); + } + return shift; +} + +function vkbeautify(){ + this.step = ' '; // 4 spaces + this.shift = createShiftArr(this.step); +}; + +vkbeautify.prototype.xml = function(text,step) { + + var ar = text.replace(/>\s{0,}</g,"><") + .replace(/</g,"~::~<") + .replace(/\s*xmlns\:/g,"~::~xmlns:") + .replace(/\s*xmlns\=/g,"~::~xmlns=") + .split('~::~'), + len = ar.length, + inComment = false, + deep = 0, + str = '', + ix = 0, + shift = step ? createShiftArr(step) : this.shift; + + for(ix=0;ix<len;ix++) { + // start comment or <![CDATA[...]]> or <!DOCTYPE // + if(ar[ix].search(/<!/) > -1) { + str += shift[deep]+ar[ix]; + inComment = true; + // end comment or <![CDATA[...]]> // + if(ar[ix].search(/-->/) > -1 || ar[ix].search(/\]>/) > -1 || ar[ix].search(/!DOCTYPE/) > -1 ) { + inComment = false; + } + } else + // end comment or <![CDATA[...]]> // + if(ar[ix].search(/-->/) > -1 || ar[ix].search(/\]>/) > -1) { + str += ar[ix]; + inComment = false; + } else + // <elm></elm> // + if( /^<\w/.exec(ar[ix-1]) && /^<\/\w/.exec(ar[ix]) && + /^<[\w:\-\.\,]+/.exec(ar[ix-1]) == /^<\/[\w:\-\.\,]+/.exec(ar[ix])[0].replace('/','')) { + str += ar[ix]; + if(!inComment) deep--; + } else + // <elm> // + if(ar[ix].search(/<\w/) > -1 && ar[ix].search(/<\//) == -1 && ar[ix].search(/\/>/) == -1 ) { + str = !inComment ? str += shift[deep++]+ar[ix] : str += ar[ix]; + } else + // <elm>...</elm> // + if(ar[ix].search(/<\w/) > -1 && ar[ix].search(/<\//) > -1) { + str = !inComment ? str += shift[deep]+ar[ix] : str += ar[ix]; + } else + // </elm> // + if(ar[ix].search(/<\//) > -1) { + str = !inComment ? str += shift[--deep]+ar[ix] : str += ar[ix]; + } else + // <elm/> // + if(ar[ix].search(/\/>/) > -1 ) { + str = !inComment ? str += shift[deep]+ar[ix] : str += ar[ix]; + } else + // <? xml ... ?> // + if(ar[ix].search(/<\?/) > -1) { + str += shift[deep]+ar[ix]; + } else + // xmlns // + if( ar[ix].search(/xmlns\:/) > -1 || ar[ix].search(/xmlns\=/) > -1) { + str += shift[deep]+ar[ix]; + } + + else { + str += ar[ix]; + } + } + + return (str[0] == '\n') ? str.slice(1) : str; +} + +vkbeautify.prototype.json = function(text,step) { + + var step = step ? step : this.step; + + if (typeof JSON === 'undefined' ) return text; + + if ( typeof text === "string" ) return JSON.stringify(JSON.parse(text), null, step); + if ( typeof text === "object" ) return JSON.stringify(text, null, step); + + return text; // text is not string nor object +} + +vkbeautify.prototype.css = function(text, step) { + + var ar = text.replace(/\s{1,}/g,' ') + .replace(/\{/g,"{~::~") + .replace(/\}/g,"~::~}~::~") + .replace(/\;/g,";~::~") + .replace(/\/\*/g,"~::~/*") + .replace(/\*\//g,"*/~::~") + .replace(/~::~\s{0,}~::~/g,"~::~") + .split('~::~'), + len = ar.length, + deep = 0, + str = '', + ix = 0, + shift = step ? createShiftArr(step) : this.shift; + + for(ix=0;ix<len;ix++) { + + if( /\{/.exec(ar[ix])) { + str += shift[deep++]+ar[ix]; + } else + if( /\}/.exec(ar[ix])) { + str += shift[--deep]+ar[ix]; + } else + if( /\*\\/.exec(ar[ix])) { + str += shift[deep]+ar[ix]; + } + else { + str += shift[deep]+ar[ix]; + } + } + return str.replace(/^\n{1,}/,''); +} + +//---------------------------------------------------------------------------- + +function isSubquery(str, parenthesisLevel) { + return parenthesisLevel - (str.replace(/\(/g,'').length - str.replace(/\)/g,'').length ) +} + +function split_sql(str, tab) { + + return str.replace(/\s{1,}/g," ") + + .replace(/ AND /ig,"~::~"+tab+tab+"AND ") + .replace(/ BETWEEN /ig,"~::~"+tab+"BETWEEN ") + .replace(/ CASE /ig,"~::~"+tab+"CASE ") + .replace(/ ELSE /ig,"~::~"+tab+"ELSE ") + .replace(/ END /ig,"~::~"+tab+"END ") + .replace(/ FROM /ig,"~::~FROM ") + .replace(/ GROUP\s{1,}BY/ig,"~::~GROUP BY ") + .replace(/ HAVING /ig,"~::~HAVING ") + //.replace(/ SET /ig," SET~::~") + .replace(/ IN /ig," IN ") + + .replace(/ JOIN /ig,"~::~JOIN ") + .replace(/ CROSS~::~{1,}JOIN /ig,"~::~CROSS JOIN ") + .replace(/ INNER~::~{1,}JOIN /ig,"~::~INNER JOIN ") + .replace(/ LEFT~::~{1,}JOIN /ig,"~::~LEFT JOIN ") + .replace(/ RIGHT~::~{1,}JOIN /ig,"~::~RIGHT JOIN ") + + .replace(/ ON /ig,"~::~"+tab+"ON ") + .replace(/ OR /ig,"~::~"+tab+tab+"OR ") + .replace(/ ORDER\s{1,}BY/ig,"~::~ORDER BY ") + .replace(/ OVER /ig,"~::~"+tab+"OVER ") + + .replace(/\(\s{0,}SELECT /ig,"~::~(SELECT ") + .replace(/\)\s{0,}SELECT /ig,")~::~SELECT ") + + .replace(/ THEN /ig," THEN~::~"+tab+"") + .replace(/ UNION /ig,"~::~UNION~::~") + .replace(/ USING /ig,"~::~USING ") + .replace(/ WHEN /ig,"~::~"+tab+"WHEN ") + .replace(/ WHERE /ig,"~::~WHERE ") + .replace(/ WITH /ig,"~::~WITH ") + + //.replace(/\,\s{0,}\(/ig,",~::~( ") + //.replace(/\,/ig,",~::~"+tab+tab+"") + + .replace(/ ALL /ig," ALL ") + .replace(/ AS /ig," AS ") + .replace(/ ASC /ig," ASC ") + .replace(/ DESC /ig," DESC ") + .replace(/ DISTINCT /ig," DISTINCT ") + .replace(/ EXISTS /ig," EXISTS ") + .replace(/ NOT /ig," NOT ") + .replace(/ NULL /ig," NULL ") + .replace(/ LIKE /ig," LIKE ") + .replace(/\s{0,}SELECT /ig,"SELECT ") + .replace(/\s{0,}UPDATE /ig,"UPDATE ") + .replace(/ SET /ig," SET ") + + .replace(/~::~{1,}/g,"~::~") + .split('~::~'); +} + +vkbeautify.prototype.sql = function(text,step) { + + var ar_by_quote = text.replace(/\s{1,}/g," ") + .replace(/\'/ig,"~::~\'") + .split('~::~'), + len = ar_by_quote.length, + ar = [], + deep = 0, + tab = this.step,//+this.step, + inComment = true, + inQuote = false, + parenthesisLevel = 0, + str = '', + ix = 0, + shift = step ? createShiftArr(step) : this.shift;; + + for(ix=0;ix<len;ix++) { + if(ix%2) { + ar = ar.concat(ar_by_quote[ix]); + } else { + ar = ar.concat(split_sql(ar_by_quote[ix], tab) ); + } + } + + len = ar.length; + for(ix=0;ix<len;ix++) { + + parenthesisLevel = isSubquery(ar[ix], parenthesisLevel); + + if( /\s{0,}\s{0,}SELECT\s{0,}/.exec(ar[ix])) { + ar[ix] = ar[ix].replace(/\,/g,",\n"+tab+tab+"") + } + + if( /\s{0,}\s{0,}SET\s{0,}/.exec(ar[ix])) { + ar[ix] = ar[ix].replace(/\,/g,",\n"+tab+tab+"") + } + + if( /\s{0,}\(\s{0,}SELECT\s{0,}/.exec(ar[ix])) { + deep++; + str += shift[deep]+ar[ix]; + } else + if( /\'/.exec(ar[ix]) ) { + if(parenthesisLevel<1 && deep) { + deep--; + } + str += ar[ix]; + } + else { + str += shift[deep]+ar[ix]; + if(parenthesisLevel<1 && deep) { + deep--; + } + } + var junk = 0; + } + + str = str.replace(/^\n{1,}/,'').replace(/\n{1,}/g,"\n"); + return str; +} + + +vkbeautify.prototype.xmlmin = function(text, preserveComments) { + + var str = preserveComments ? text + : text.replace(/\<![ \r\n\t]*(--([^\-]|[\r\n]|-[^\-])*--[ \r\n\t]*)\>/g,"") + .replace(/[ \r\n\t]{1,}xmlns/g, ' xmlns'); + return str.replace(/>\s{0,}</g,"><"); +} + +vkbeautify.prototype.jsonmin = function(text) { + + if (typeof JSON === 'undefined' ) return text; + + return JSON.stringify(JSON.parse(text), null, 0); + +} + +vkbeautify.prototype.cssmin = function(text, preserveComments) { + + var str = preserveComments ? text + : text.replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\//g,"") ; + + return str.replace(/\s{1,}/g,' ') + .replace(/\{\s{1,}/g,"{") + .replace(/\}\s{1,}/g,"}") + .replace(/\;\s{1,}/g,";") + .replace(/\/\*\s{1,}/g,"/*") + .replace(/\*\/\s{1,}/g,"*/"); +} + +vkbeautify.prototype.sqlmin = function(text) { + return text.replace(/\s{1,}/g," ").replace(/\s{1,}\(/,"(").replace(/\s{1,}\)/,")"); +} + +window.vkbeautify = new vkbeautify(); + +})(); + |