2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
22 package org.openecomp.appc.dg.flowbuilder.impl;
26 import org.openecomp.appc.dg.flowbuilder.exception.InvalidDependencyModel;
27 import org.openecomp.appc.domainmodel.Vnfc;
30 public class ReverseFlowStrategy extends AbstractFlowStrategy {
33 protected List<List<Vnfc>> orderDependencies() {
34 ArrayList<List<Vnfc>> arrayList = new ArrayList<>();
36 Queue<Vnfc> queue1 = new LinkedList();
37 Set<Vnfc> queue2 = new LinkedHashSet<>();
39 Set<Vnfc> uniqueElementSet = new HashSet<>();
40 Set<Vnfc> duplicateElementSet = new HashSet<>();
42 // identifying independent nodes in queue1
43 for(int colIndex=0;colIndex<graph.getSize();colIndex++){
45 for(int rowIndex=0;rowIndex<graph.getSize();rowIndex++){
46 sum+= graph.getDependencyMatrix()[rowIndex][colIndex];
49 Vnfc vnfc = graph.getVertexList().get(colIndex);
54 throw new InvalidDependencyModel("There seems to be no leaf node for Vnfc dependencies");
56 arrayList.add((List<Vnfc>)queue1);
57 queue1 = new LinkedList<>(queue1);
62 // iterating over queue1 and for each node in it finding all dependent nodes and putting them on queue2
63 while(!queue1.isEmpty()){
64 Vnfc listItem = queue1.remove();
65 Integer rowIndex = graph.getIndex(listItem);
66 for(Integer index =0;index<graph.getSize();index++){
67 Integer value = graph.getDependencyMatrix()[rowIndex][index];
69 Vnfc vnfc = graph.getVertexList().get(index);
74 for(Vnfc vnfc:queue2){
75 if(!uniqueElementSet.add(vnfc)){
76 duplicateElementSet.add(vnfc);
80 flag= false; // empty queue2 indicates that all leaf nodes have been identified, i.e. stop the iteration
83 arrayList.add(new ArrayList<Vnfc>(queue2));
84 if(arrayList.size()>graph.getSize()){
85 // dependency list cannot be larger than total number of nodes
86 // if it happens indicates cycle in the dependency
87 throw new InvalidDependencyModel("Cycle detected in the VNFC dependencies");
89 queue1.addAll(queue2);
90 queue2 = new LinkedHashSet<>();
93 // If any node depends on multiple nodes present in different execution sequence,
94 // its execution should happen on the higher order, removing its presence on lower execution sequence
95 if(!duplicateElementSet.isEmpty()){
96 for(Vnfc vnfc:duplicateElementSet){
97 boolean firstOccurrence= true;
98 for(int i=0;i<arrayList.size();i++){
99 List<Vnfc> list = arrayList.get(i);
100 if(list.contains(vnfc)){
102 firstOccurrence =false;