Name

sn_cs_builder.GraphExplorer

Description

No description available

Script

var GraphExplorer = Class.create();
GraphExplorer.prototype = {
  initialize: function() {
  },

  State : {"HAS_EXIT" : "HAS_EXIT", "NO_EXIT": "NO_EXIT", "ENDLESS_LOOP": "ENDLESS_LOOP", "IS_ERROR" : "IS_ERROR" },

  PathState: function(node, state)  {
  	var obj = {
  			"state" : state,
  			"node" : node,
  				
  			getState : function() {
  				return this.state;
  			},
  				
  			setState : function (state) {
  				this.state = state;
  			},
  				
  			getNode : function() {
  				return this.node;
  			},
  				
  			setNode : function(node) {
  				this.node = node;
  			}
  		};
  	
  	return obj;
  },
  
  traverse : function(map, rootNodeId, visited, count) {		
  	if (!count)
  		count = 0;
  	
  	var rootNode = map[rootNodeId];
  	var outcome =  this.PathState(rootNode, this.State.NO_EXIT);
  	var hasBeenVisited = visited.indexOf(rootNodeId) > -1;
  
  	if (hasBeenVisited || count > 500) {
  		outcome.setState(this.State.ENDLESS_LOOP);
  		gs.debug("Possible infinte loop, studying node {0}, ({1})", rootNodeId, rootNode.getName());
  		
  		return outcome;
  	}
  
  	if(!rootNode.hasChild()) {
  		gs.debug("Leaf Node: {0}", rootNode.getName());
  		outcome.setState(this.State.HAS_EXIT);
  		
  		return outcome;
  	}
  	
  	visited.push(rootNodeId);
  	
  	if(rootNode.type == "ValidatorDecisionNode") {
  		var childState = this.State.NO_EXIT;
  		var children = rootNode.getChildren(map);
  		for (var i = 0; i < children.length; i++) {
  			var childNode = children[i];
  			outcome = this.traverse(map, childNode.sys_id, visited, count + 1);
  	
  			if (outcome.getState() == this.State.ENDLESS_LOOP) {
  				outcome.setState(this.State.NO_EXIT); // set state to NO_EXIT because we are at a decision node
  			}

  			if(outcome.getState() == this.State.IS_ERROR) {
  				gs.error("Endless Loop: {0} ({1})", childNode.getName(), childNode.sys_id);

  				return outcome;
  			} else if (outcome.getState() == this.State.HAS_EXIT) {
  				childState = this.State.HAS_EXIT;
  			}
  		}
  		
  		gs.debug("End of branch: {0}, state: {1}", rootNode.getName(), childState);
  		outcome.setState(childState);
  		
  		return outcome;
  	} else {
  		// Not a decision node
  		outcome = this.traverse(map, rootNode.getChildNode(map).sys_id, visited, count + 1);
  		if (outcome.getState() == this.State.ENDLESS_LOOP && outcome.getNode().sys_id == rootNode.sys_id)
  			outcome.setState(this.State.IS_ERROR);
  			
  		return outcome;
  	}
  	
  },
  
  type: 'GraphExplorer'
};

Sys ID

9051a9d4b3000300f7d1a13816a8dc24

Offical Documentation

Official Docs: