blob: fd84208dbd78e25a1b5e0c10c71a39116bf6941a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import Ember from 'ember';
var FindNodeMixin= Ember.Mixin.create({
findNodeById(startNode,id){
return this._findNodeById(startNode,id);
},
findNodeByType(startNode,type){
return this._findNodeByAttr(startNode,type,"type");
},
findTransition(startNode,sourceId,targetId){
return this._findTransition(startNode,sourceId,targetId);
},
_findTransition(node,sourceId,targetId){
if (!node.transitions){
return null;
}
var res;
for (var i = 0; i < node.transitions.length; i++) {
var tran= node.transitions[i];
if (node.id===sourceId && tran.getTargetNode(false).id===targetId){
res=tran;
}else{
res=this._findTransition(tran.getTargetNode(false),sourceId,targetId);
}
if (res){
break;
}
}
return res;
},
findTransitionTo(startNode,nodeid){
return this._findTransitionTo(startNode,nodeid);
},
_findTransitionTo(node,nodeid){
if (!node.transitions){
return null;
}
var res;
for (var i = 0; i < node.transitions.length; i++) {
var tran= node.transitions[i];
if (tran.getTargetNode(false).id===nodeid){
res=tran;
}else{
res=this._findTransitionTo(tran.getTargetNode(false),nodeid);
}
if (res){
break;
}
}
return res;
},
_findNodeById(node,id){
return this._findNodeByAttr(node,id,"id");
},
_findNodeByAttr(node,id,attrType){
var self=this;
if (node.get(attrType)===id){
return node;
}else{
if (node.transitions){
var res;
for (var i = 0; i < node.transitions.length; i++) {
var transition=node.transitions[i];
res= self._findNodeByAttr(transition.getTargetNode(false),id,attrType);
if (res){
break;
}
}
return res;
}else{
return null;
}
}
},
getOKToNode(node){
var okToNode;
if (!node){
okToNode = null;
}else{
var transitions = node.transitions;
transitions.forEach(function(trans){
if (!trans.condition){
okToNode = trans.targetNode;
return;
}
});
}
return okToNode;
},
getDesendantNodes(node, ignoreEndNode){
if (!node){
return null;
}
var currNode=null;
var nodes = [], nxtPath = node.getTargets();
for(var i =0; i< nxtPath.length; i++){
currNode = nxtPath[i];
do {
if(this._insertUniqueNodes(currNode, nodes) && currNode){
nodes.push(currNode);
}
var nodesList = currNode.getTargets();
if(nodesList.length > 1){
for(var j=0; j<nodesList.length; j++) {
if(nodesList[j].getTargets().length>1){
var tmp = this.getDesendantNodes(nodesList[j]);
if(tmp.length){
nodes = nodes.concat(tmp);
}
} else if(this._insertUniqueNodes(nodesList[j], nodes) && nodesList[j]){
nodes.push(nodesList[j]);
currNode = nodesList[j];
} else {
currNode = nodesList[j];
}
}
} else {
currNode = nodesList[0];
}
} while(currNode && currNode.get("id") && currNode.get("id") !== "node-end");
}
if(!ignoreEndNode && currNode){
nodes.push(currNode);
}
return nodes;
},
_insertUniqueNodes(currNode, nodes){
if(nodes.indexOf(currNode) > -1){
} else {
if (!( currNode.isKillNode() || currNode.isPlaceholder() || currNode.isJoinNode() || currNode.isDecisionEnd())){
return true;
}
}
},
_findCommonTargetNodeId(node){
var nodeIds = {}, targ, decPath = node.getTargets(), tempId = 0;
for(var i =0; i< decPath.length; i++){
var currNode = decPath[i];
do {
if(nodeIds.hasOwnProperty(currNode.get("id"))){
nodeIds[currNode.get("id")] = nodeIds[currNode.get("id")] + 1;
} else {
nodeIds[currNode.get("id")] = 1;
}
if(currNode.get("id") === "node-end"){
break;
}
currNode = currNode.getTargets()[0];
} while(currNode && currNode.get("id"));
}
for(var j in nodeIds){
if(tempId < nodeIds[j]){
targ = j;
tempId = nodeIds[j];
}
}
return targ;
},
_findCommonTargetNode(node){
var nodeIds = {}, targ, decPath = node.getTargets(), tempId = 0;
for(var i =0; i< decPath.length; i++){
var currNode = decPath[i];
do {
if(nodeIds.hasOwnProperty(currNode.get("id"))){
nodeIds[currNode.get("id")] = nodeIds[currNode.get("id")] + 1;
} else {
nodeIds[currNode.get("id")] = 1;
}
if(currNode.get("id") === "node-end"){
break;
}
currNode = currNode.getTargets()[0];
} while(currNode && currNode.get("id"));
}
for(var j in nodeIds){
if(tempId < nodeIds[j]){
targ = j;
tempId = nodeIds[j];
}
}
return targ;
},
findCommonTargetNode(startNode,node){
var commonTargetId=this._findCommonTargetNodeId(node);
return this.findNodeById(startNode,commonTargetId);
}
});
export{FindNodeMixin};