[SDC-29] Amdocs OnBoard 1707 initial commit.
[sdc.git] / openecomp-ui / src / sdc-app / onboarding / softwareProduct / dependencies / SoftwareProductDependenciesUtils.js
1 /*!
2  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
13  * or implied. See the License for the specific language governing
14  * permissions and limitations under the License.
15  */
16
17 import DirectedGraph from 'nfvo-utils/DirectedGraph.js';
18
19 function findCycles(graph, node, id, visited = {}, visitedConnections = {}, recursionStack = {}, connectionsWithCycle = {}) {
20         visited[node] = true;
21         recursionStack[node] = true;
22         if (id) {
23                 visitedConnections[id] = true;
24         }
25         for (let edge of graph.getEdges(node)) {
26                 if (!visited[edge.target]) {
27                         findCycles(graph, edge.target, edge.id, visited, visitedConnections, recursionStack, connectionsWithCycle);
28                 } else if (recursionStack[edge.target]) {
29                         visitedConnections[edge.id] = true;
30                         for (let connection in visitedConnections) {
31                                 connectionsWithCycle[connection] = true;
32                         }
33                 }
34         }
35         recursionStack[node] = false;
36         return {visitedNodes: visited, connectionsWithCycle: connectionsWithCycle};
37 }
38
39 export function checkCyclesAndMarkDependencies(dependenciesList) {
40         let overallVisitedNodes = {};
41         let overallConnectionsWithCycles = {};
42
43         let g = new DirectedGraph();
44         for (let dependency of dependenciesList) {
45                 if (dependency.sourceId !== null && dependency.targetId !== null) {
46                         g.addEdge(dependency.sourceId, dependency.targetId, {id: dependency.id});
47                 }
48         }
49
50         for (let node in g.nodes) {
51                 if (!overallVisitedNodes.node) {
52                         let {visitedNodes, connectionsWithCycle} = findCycles(g, node, undefined);
53                         overallVisitedNodes = {...overallVisitedNodes, ...visitedNodes};
54                         overallConnectionsWithCycles = {...overallConnectionsWithCycles, ...connectionsWithCycle};
55                 }
56         }
57         return dependenciesList.map(dependency => (
58                 {
59                         ...dependency,
60                          hasCycle: dependency.sourceId && dependency.targetId ? 
61                                 overallConnectionsWithCycles.hasOwnProperty(dependency.id) 
62                                  : undefined
63                 }));
64 }