Updating licenses in all files
[appc.git] / appc-dg / appc-dg-shared / appc-dg-dependency-model / src / main / java / org / openecomp / appc / dg / flowbuilder / impl / AbstractFlowStrategy.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * APPC
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * Copyright (C) 2017 Amdocs
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
11  * 
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  * 
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=========================================================
20  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
21  */
22
23 package org.openecomp.appc.dg.flowbuilder.impl;
24
25 import com.att.eelf.configuration.EELFLogger;
26 import com.att.eelf.configuration.EELFManager;
27
28 import java.util.Iterator;
29 import java.util.List;
30 import java.util.Set;
31
32 import org.openecomp.appc.dg.flowbuilder.FlowStrategy;
33 import org.openecomp.appc.dg.flowbuilder.exception.InvalidDependencyModel;
34 import org.openecomp.appc.dg.flowbuilder.helper.Graph;
35 import org.openecomp.appc.dg.objects.*;
36 import org.openecomp.appc.domainmodel.Vnfc;
37
38
39 public abstract class AbstractFlowStrategy implements FlowStrategy {
40
41     protected Graph<Vnfc> graph;
42
43     private static final EELFLogger logger = EELFManager.getInstance().getLogger(AbstractFlowStrategy.class);
44
45     public VnfcFlowModel buildFlowModel(VnfcDependencyModel dependencyModel, InventoryModel inventoryModel) {
46         if(logger.isTraceEnabled()){
47             logger.trace("Entering into buildFlowModel with dependency model = " + dependencyModel
48                     + "inventory model = " +inventoryModel);
49         }
50
51         if(dependencyModel == null
52                 || dependencyModel.getDependencies() ==null
53                 || dependencyModel.getDependencies().size() ==0){
54             logger.debug("Dependency model not available, building flow model with sequence");
55             throw new InvalidDependencyModel("Dependency model either null or does not contain any dependency");
56         }
57
58         VnfcFlowModel flowModel = buildFlowModel(dependencyModel);
59         if(logger.isDebugEnabled()){
60             logger.debug("Flow Model without instance data: \n" + flowModel);
61         }
62
63         logger.info("Populating flow model with A&AI data");
64         populateFlowModel(flowModel,inventoryModel);
65         if(logger.isDebugEnabled()){
66             logger.debug("Flow Model with instance data: \n" + flowModel);
67         }
68
69         return flowModel;
70     }
71
72     private void populateFlowModel(VnfcFlowModel flowModel, InventoryModel inventoryModel) {
73         Iterator<List<Vnfc>> flowIterator = null;
74
75         for(Vnfc vnfcFromInventory:inventoryModel.getVnf().getVnfcs()){
76             flowIterator = flowModel.getModelIterator();
77             String vnfcType = vnfcFromInventory.getVnfcType();
78             while (flowIterator.hasNext()){
79                 for(Vnfc vnfcFromFlowModel:flowIterator.next() ){
80                     if(vnfcType.equalsIgnoreCase(vnfcFromFlowModel.getVnfcType())){
81                         vnfcFromFlowModel.setVnfcName(vnfcFromInventory.getVnfcName());
82                         vnfcFromFlowModel.addVms(vnfcFromInventory.getVserverList());
83                     }
84                 }
85             }
86
87         }
88
89     }
90
91     private VnfcFlowModel buildFlowModel(VnfcDependencyModel dependencyModel) throws InvalidDependencyModel {
92         Set<Node<Vnfc>> dependencies = dependencyModel.getDependencies();
93         graph = new Graph(dependencies.size());
94
95         for(Node<Vnfc> node:dependencies){
96             graph.addVertex(node.getChild());
97         }
98
99         for(Node node:dependencies){
100             Vnfc child = (Vnfc)node.getChild();
101             List<Vnfc> parents = node.getParents();
102             for(Vnfc parent:parents){
103                 graph.addEdge(child,parent);
104             }
105         }
106         List<List<Vnfc>> dependencyList = orderDependencies();
107
108         VnfcFlowModel.VnfcFlowModelBuilder builder = new VnfcFlowModel.VnfcFlowModelBuilder();
109         int count=0;
110         int flowModelSize = 0;
111         for(List<Vnfc> vnfcList:dependencyList){
112             builder.addMetadata(count,vnfcList);
113             flowModelSize += vnfcList.size();
114             count++;
115         }
116         if(flowModelSize != dependencies.size()){
117             throw new InvalidDependencyModel("Cycle detected in the VNFC dependencies");
118         }
119
120         return builder.build();
121     }
122
123     protected abstract List<List<Vnfc>> orderDependencies();
124
125     /*private VnfcFlowModel buildFlowModelWithoutSequence(InventoryModel inventoryModel) {
126         VnfcFlowModel.VnfcFlowModelBuilder builder = new VnfcFlowModel.VnfcFlowModelBuilder();
127
128         for(Vnfc vnfc:inventoryModel.getVnf().getVnfcs()){
129             builder = builder.addMetadata(0,vnfc);
130         }
131
132         return builder.build();
133     }*/
134 }