Support TOSCA functions in Node Filters
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / impl / utils / CINodeFilterUtils.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 package org.openecomp.sdc.be.components.impl.utils;
17
18 import java.util.Collection;
19 import java.util.List;
20 import java.util.Map;
21 import java.util.stream.Collectors;
22 import org.apache.commons.collections4.CollectionUtils;
23 import org.openecomp.sdc.be.datatypes.elements.CINodeFilterDataDefinition;
24 import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition;
25 import org.openecomp.sdc.be.datatypes.elements.PropertyFilterDataDefinition;
26 import org.openecomp.sdc.be.datatypes.elements.RequirementNodeFilterCapabilityDataDefinition;
27 import org.openecomp.sdc.be.model.UploadNodeFilterCapabilitiesInfo;
28 import org.openecomp.sdc.be.model.UploadNodeFilterInfo;
29 import org.openecomp.sdc.be.model.UploadNodeFilterPropertyInfo;
30 import org.openecomp.sdc.be.utils.PropertyFilterConstraintDataDefinitionHelper;
31
32 public class CINodeFilterUtils {
33
34     public CINodeFilterDataDefinition getNodeFilterDataDefinition(final UploadNodeFilterInfo uploadNodeFilterInfo, final String uniqueId) {
35         final var nodeFilterDataDefinition = new CINodeFilterDataDefinition();
36         nodeFilterDataDefinition.setName(uploadNodeFilterInfo.getName());
37         final List<PropertyFilterDataDefinition> propertyFilterList = uploadNodeFilterInfo.getProperties().stream()
38             .map(this::buildOnePropertyFilterForEachConstraint)
39             .flatMap(Collection::stream)
40             .collect(Collectors.toList());
41         final ListDataDefinition<PropertyFilterDataDefinition> listDataDefinition = new ListDataDefinition<>();
42         listDataDefinition.getListToscaDataDefinition().addAll(propertyFilterList);
43         nodeFilterDataDefinition.setProperties(listDataDefinition);
44         nodeFilterDataDefinition.setCapabilities(convertCapabilities(uploadNodeFilterInfo.getCapabilities()));
45         nodeFilterDataDefinition.setID(uniqueId);
46         nodeFilterDataDefinition.setTosca_id(uploadNodeFilterInfo.getTosca_id());
47         return nodeFilterDataDefinition;
48     }
49
50     private ListDataDefinition<RequirementNodeFilterCapabilityDataDefinition> convertCapabilities(
51         Map<String, UploadNodeFilterCapabilitiesInfo> capabilities) {
52         ListDataDefinition<RequirementNodeFilterCapabilityDataDefinition> listDataDefinition = new ListDataDefinition<>();
53         for (UploadNodeFilterCapabilitiesInfo capability : capabilities.values()) {
54             RequirementNodeFilterCapabilityDataDefinition requirementNodeFilterCapabilityDataDefinition = convertCapability(capability);
55             listDataDefinition.add(requirementNodeFilterCapabilityDataDefinition);
56         }
57         return listDataDefinition;
58     }
59
60     private RequirementNodeFilterCapabilityDataDefinition convertCapability(UploadNodeFilterCapabilitiesInfo capability) {
61         RequirementNodeFilterCapabilityDataDefinition retVal = new RequirementNodeFilterCapabilityDataDefinition();
62         retVal.setName(capability.getName());
63         List<PropertyFilterDataDefinition> props = capability.getProperties().stream().map(this::buildProperty)
64             .collect(Collectors.toList());
65         ListDataDefinition<PropertyFilterDataDefinition> propsList = new ListDataDefinition<>();
66         propsList.getListToscaDataDefinition().addAll(props);
67         retVal.setProperties(propsList);
68         return retVal;
69     }
70
71     private PropertyFilterDataDefinition buildProperty(final UploadNodeFilterPropertyInfo uploadNodeFilterPropertyInfo) {
72         final var propertyFilter = new PropertyFilterDataDefinition();
73         propertyFilter.setName(uploadNodeFilterPropertyInfo.getName());
74         final List<String> propertyConstraints = uploadNodeFilterPropertyInfo.getValues();
75         if (CollectionUtils.isNotEmpty(propertyConstraints)) {
76             propertyFilter.setConstraints(
77                 propertyConstraints.stream()
78                     .map(PropertyFilterConstraintDataDefinitionHelper::convertLegacyConstraint)
79                     .collect(Collectors.toList())
80             );
81         }
82         return propertyFilter;
83     }
84
85     private List<PropertyFilterDataDefinition> buildOnePropertyFilterForEachConstraint(final UploadNodeFilterPropertyInfo uploadNodeFilterProperty) {
86         final List<String> propertyConstraints = uploadNodeFilterProperty.getValues();
87         if (CollectionUtils.isNotEmpty(propertyConstraints)) {
88             return propertyConstraints.stream()
89                 .map(PropertyFilterConstraintDataDefinitionHelper::convertLegacyConstraint)
90                 .map(propertyFilterConstraint -> {
91                     final var propertyFilter = new PropertyFilterDataDefinition();
92                     propertyFilter.setName(uploadNodeFilterProperty.getName());
93                     propertyFilter.setConstraints(List.of(propertyFilterConstraint));
94                     return propertyFilter;
95                 }).collect(Collectors.toList());
96         } else {
97             final var propertyFilter = new PropertyFilterDataDefinition();
98             propertyFilter.setName(uploadNodeFilterProperty.getName());
99             return List.of(propertyFilter);
100         }
101     }
102 }