thingsboard/ui/node_modules/ngFlowchart/app/flowchart/modelvalidation-service.js
2020-05-19 11:43:42 +03:00

143 lines
4.6 KiB
JavaScript

(function() {
'use strict';
function Modelvalidation(Topsortservice, flowchartConstants) {
function ModelvalidationError(message) {
this.message = message;
}
ModelvalidationError.prototype = new Error;
ModelvalidationError.prototype.name = 'ModelvalidationError';
ModelvalidationError.prototype.constructor = ModelvalidationError;
this.ModelvalidationError = ModelvalidationError;
this.validateModel = function(model) {
this.validateNodes(model.nodes);
this._validateEdges(model.edges, model.nodes);
return model;
};
this.validateNodes = function(nodes) {
var that = this;
var ids = [];
angular.forEach(nodes, function(node) {
that.validateNode(node);
if (ids.indexOf(node.id) !== -1) {
throw new ModelvalidationError('Id not unique.');
}
ids.push(node.id);
});
var connectorIds = [];
angular.forEach(nodes, function(node) {
angular.forEach(node.connectors, function(connector) {
if (connectorIds.indexOf(connector.id) !== -1) {
throw new ModelvalidationError('Id not unique.');
}
connectorIds.push(connector.id);
});
});
return nodes;
};
this.validateNode = function(node) {
var that = this;
if (node.id === undefined) {
throw new ModelvalidationError('Id not valid.');
}
if (typeof node.name !== 'string') {
throw new ModelvalidationError('Name not valid.');
}
if (typeof node.x !== 'number' || node.x < 0 || Math.round(node.x) !== node.x) {
throw new ModelvalidationError('Coordinates not valid.')
}
if (typeof node.y !== 'number' || node.y < 0 || Math.round(node.y) !== node.y) {
throw new ModelvalidationError('Coordinates not valid.')
}
if (!Array.isArray(node.connectors)) {
throw new ModelvalidationError('Connectors not valid.');
}
angular.forEach(node.connectors, function(connector) {
that.validateConnector(connector);
});
return node;
};
this._validateEdges = function(edges, nodes) {
var that = this;
angular.forEach(edges, function(edge) {
that._validateEdge(edge, nodes);
});
angular.forEach(edges, function(edge1, index1) {
angular.forEach(edges, function(edge2, index2) {
if (index1 !== index2) {
if ((edge1.source === edge2.source && edge1.destination === edge2.destination) || (edge1.source === edge2.destination && edge1.destination === edge2.source)) {
throw new ModelvalidationError('Duplicated edge.')
}
}
});
});
if (Topsortservice({nodes: nodes, edges: edges}) === null) {
throw new ModelvalidationError('Graph has a circle.');
}
return edges;
};
this.validateEdges = function(edges, nodes) {
this.validateNodes(nodes);
return this._validateEdges(edges, nodes);
};
this._validateEdge = function(edge, nodes) {
if (edge.source === undefined) {
throw new ModelvalidationError('Source not valid.');
}
if (edge.destination === undefined) {
throw new ModelvalidationError('Destination not valid.');
}
if (edge.source === edge.destination) {
throw new ModelvalidationError('Edge with same source and destination connectors.');
}
var sourceNode = nodes.filter(function(node) {return node.connectors.some(function(connector) {return connector.id === edge.source})})[0];
if (sourceNode === undefined) {
throw new ModelvalidationError('Source not valid.');
}
var destinationNode = nodes.filter(function(node) {return node.connectors.some(function(connector) {return connector.id === edge.destination})})[0];
if (destinationNode === undefined) {
throw new ModelvalidationError('Destination not valid.');
}
if (sourceNode === destinationNode) {
throw new ModelvalidationError('Edge with same source and destination nodes.');
}
return edge;
};
this.validateEdge = function(edge, nodes) {
this.validateNodes(nodes);
return this._validateEdge(edge, nodes);
};
this.validateConnector = function(connector) {
if (connector.id === undefined) {
throw new ModelvalidationError('Id not valid.');
}
if (connector.type === undefined || connector.type === null || typeof connector.type !== 'string') {
throw new ModelvalidationError('Type not valid.');
}
return connector;
};
}
angular.module('flowchart')
.service('Modelvalidation', Modelvalidation);
}());