re base code
[sdc.git] / openecomp-be / lib / openecomp-sdc-translator-lib / openecomp-sdc-translator-core / src / main / java / org / openecomp / sdc / translator / datatypes / heattotosca / unifiedmodel / consolidation / PortTemplateConsolidationData.java
1 /*
2  * Copyright © 2016-2018 European Support Limited
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 or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation;
18
19 import com.google.common.collect.ArrayListMultimap;
20 import com.google.common.collect.ListMultimap;
21 import com.google.common.collect.Multimaps;
22 import org.apache.commons.collections4.CollectionUtils;
23 import org.openecomp.core.utilities.file.FileUtils;
24 import org.openecomp.sdc.heat.datatypes.model.Resource;
25 import org.openecomp.sdc.tosca.datatypes.ToscaNodeType;
26 import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil;
27
28 import java.util.List;
29 import java.util.Objects;
30 import java.util.Optional;
31
32 public class PortTemplateConsolidationData extends EntityConsolidationData {
33
34     // key - sub-interface type - for ResourceGroup it is the nested file name
35     // value - List of sub-interfaces of that type in the port
36     private final ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfaceConsolidationData =
37             Multimaps.synchronizedListMultimap(ArrayListMultimap.create());
38
39     private String networkRole;
40
41     public String getNetworkRole() {
42         return networkRole;
43     }
44
45     public void setNetworkRole(String networkRole) {
46         this.networkRole = networkRole;
47     }
48
49     public boolean isPortBoundToSubInterface() {
50         return !subInterfaceConsolidationData.isEmpty();
51     }
52
53     /**
54     * Create Sub interface template consolidation data base on given parameters - if it doesn't exist yet.
55     *
56     * @param resource resource of sub Interface
57     * @param subInterfaceNodeTemplateId template id of sub interface
58     * @param parentPortNodeTemplateId node template id of port node to which sub interface is related
59     * @return sub interface template consolidation data entity
60     */
61     public SubInterfaceTemplateConsolidationData addSubInterfaceTemplateConsolidationData(
62             Resource resource, String subInterfaceNodeTemplateId, String parentPortNodeTemplateId) {
63         String subInterfaceType = createSubInterfaceType(resource);
64         List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList =
65                 subInterfaceConsolidationData.get(subInterfaceType);
66         SubInterfaceTemplateConsolidationData consolidationData = null;
67         if (CollectionUtils.isNotEmpty(subInterfaceTemplateConsolidationDataList)) {
68             Optional<SubInterfaceTemplateConsolidationData> optionalConsolidationData =
69                     subInterfaceTemplateConsolidationDataList.stream()
70                     .filter(s -> s.getNodeTemplateId().equals(subInterfaceNodeTemplateId))
71                     .findFirst();
72             if (optionalConsolidationData.isPresent()) {
73                 consolidationData = optionalConsolidationData.get();
74             }
75         }
76
77         if (Objects.isNull(consolidationData)) {
78             consolidationData =
79                     createSubInterfaceConsolidationData(subInterfaceNodeTemplateId, parentPortNodeTemplateId);
80             addSubInterfaceConsolidationData(subInterfaceType, consolidationData);
81         }
82         return consolidationData;
83     }
84
85     private String createSubInterfaceType(Resource resource) {
86         return ToscaNodeType.VLAN_SUB_INTERFACE_RESOURCE_TYPE_PREFIX
87             + FileUtils.getFileWithoutExtention(
88             HeatToToscaUtil.getSubInterfaceResourceType(resource));
89     }
90
91     private SubInterfaceTemplateConsolidationData createSubInterfaceConsolidationData(
92             String subInterfaceNodeTemplateId, String parentPortNodeTemplateId) {
93         SubInterfaceTemplateConsolidationData data = new SubInterfaceTemplateConsolidationData();
94         data.setNodeTemplateId(subInterfaceNodeTemplateId);
95         data.setParentPortNodeTemplateId(parentPortNodeTemplateId);
96         return data;
97     }
98
99     public void addSubInterfaceConsolidationData(String subPortType,
100                                                SubInterfaceTemplateConsolidationData
101                                                    subInterfaceTemplateConsolidationData) {
102         this.subInterfaceConsolidationData.put(subPortType, subInterfaceTemplateConsolidationData);
103     }
104
105     public boolean hasSameSubInterfaceTypes(PortTemplateConsolidationData other) {
106         return other != null && this.subInterfaceConsolidationData.keySet().equals(
107         other.subInterfaceConsolidationData.keySet());
108     }
109
110     public void copyMappedInto(ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfaceTypeToEntity) {
111         subInterfaceTypeToEntity.putAll(this.subInterfaceConsolidationData);
112     }
113
114     public void copyFlatInto(List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList) {
115         subInterfaceTemplateConsolidationDataList.addAll(subInterfaceConsolidationData.values());
116     }
117
118     public boolean isNumberOfSubInterfacesPerTypeSimilar(PortTemplateConsolidationData other) {
119         return isBothSubInterfaceConsolidationDataEmpty(this, other)
120                || isBothSubInterfaceConsolidationDataNotEmpty(this, other)
121                  && this.subInterfaceConsolidationData.keySet().stream().allMatch(
122                          subInterfaceType -> calculateSize(other.subInterfaceConsolidationData.get(subInterfaceType))
123                          ==  calculateSize(this.subInterfaceConsolidationData.get(subInterfaceType)));
124
125     }
126
127     private boolean isBothSubInterfaceConsolidationDataEmpty(
128             PortTemplateConsolidationData object, PortTemplateConsolidationData other) {
129         return object.subInterfaceConsolidationData.isEmpty() && other.subInterfaceConsolidationData.isEmpty();
130     }
131
132     private boolean isBothSubInterfaceConsolidationDataNotEmpty(
133             PortTemplateConsolidationData object, PortTemplateConsolidationData other) {
134         return !object.subInterfaceConsolidationData.isEmpty() && !other.subInterfaceConsolidationData.isEmpty();
135     }
136
137     public boolean isSubInterfaceNodeTemplateIdParameter(String nodeTemplateType) {
138         List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList =
139                 this.subInterfaceConsolidationData.get(nodeTemplateType);
140         return (Objects.nonNull(subInterfaceTemplateConsolidationDataList)
141             && subInterfaceTemplateConsolidationDataList.size() > 1);
142     }
143
144     private int calculateSize(List<SubInterfaceTemplateConsolidationData> subInterfaces) {
145         return subInterfaces == null ? 0 : subInterfaces.size();
146     }
147 }