Backend support for operation milestones with activities
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / tosca / InterfacesOperationsConverter.java
1 /*
2  * Copyright © 2016-2020 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.be.tosca;
18
19 import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.DEFAULT;
20 import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.INPUTS;
21 import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.OPERATIONS;
22
23 import com.fasterxml.jackson.annotation.JsonInclude;
24 import com.fasterxml.jackson.databind.DeserializationFeature;
25 import com.fasterxml.jackson.databind.ObjectMapper;
26 import com.fasterxml.jackson.databind.module.SimpleModule;
27 import com.google.gson.Gson;
28 import java.util.ArrayList;
29 import java.util.Collections;
30 import java.util.HashMap;
31 import java.util.List;
32 import java.util.Map;
33 import java.util.Map.Entry;
34 import java.util.Objects;
35 import java.util.Set;
36 import java.util.stream.Collectors;
37 import org.apache.commons.collections.MapUtils;
38 import org.apache.commons.collections4.CollectionUtils;
39 import org.apache.commons.lang3.StringUtils;
40 import org.apache.commons.lang3.math.NumberUtils;
41 import org.openecomp.sdc.be.datatypes.elements.ActivityDataDefinition;
42 import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
43 import org.openecomp.sdc.be.datatypes.elements.InputDataDefinition;
44 import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition;
45 import org.openecomp.sdc.be.datatypes.elements.MilestoneDataDefinition;
46 import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
47 import org.openecomp.sdc.be.datatypes.elements.OperationInputDefinition;
48 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
49 import org.openecomp.sdc.be.datatypes.enums.ActivityTypeEnum;
50 import org.openecomp.sdc.be.datatypes.enums.MilestoneTypeEnum;
51 import org.openecomp.sdc.be.model.Component;
52 import org.openecomp.sdc.be.model.ComponentInstance;
53 import org.openecomp.sdc.be.model.DataTypeDefinition;
54 import org.openecomp.sdc.be.model.InterfaceDefinition;
55 import org.openecomp.sdc.be.model.Product;
56 import org.openecomp.sdc.be.model.PropertyDefinition;
57 import org.openecomp.sdc.be.tosca.PropertyConvertor.PropertyType;
58 import org.openecomp.sdc.be.tosca.model.ToscaActivity;
59 import org.openecomp.sdc.be.tosca.model.ToscaArtifactDefinition;
60 import org.openecomp.sdc.be.tosca.model.ToscaInput;
61 import org.openecomp.sdc.be.tosca.model.ToscaInterfaceDefinition;
62 import org.openecomp.sdc.be.tosca.model.ToscaInterfaceNodeType;
63 import org.openecomp.sdc.be.tosca.model.ToscaInterfaceOperationImplementation;
64 import org.openecomp.sdc.be.tosca.model.ToscaLifecycleOperationDefinition;
65 import org.openecomp.sdc.be.tosca.model.ToscaMilestone;
66 import org.openecomp.sdc.be.tosca.model.ToscaNodeType;
67 import org.openecomp.sdc.be.tosca.model.ToscaProperty;
68 import org.openecomp.sdc.be.tosca.model.ToscaPropertyAssignment;
69 import org.openecomp.sdc.be.tosca.model.ToscaPropertyAssignmentJsonSerializer;
70 import org.openecomp.sdc.be.tosca.utils.OperationArtifactUtil;
71 import org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum;
72 import org.openecomp.sdc.tosca.datatypes.ToscaFunctions;
73 import org.springframework.beans.factory.annotation.Autowired;
74 import org.springframework.stereotype.Service;
75
76 @Service
77 public class InterfacesOperationsConverter {
78
79     public static final String SELF = "SELF";
80     private static final String DERIVED_FROM_STANDARD_INTERFACE = "tosca.interfaces.node.lifecycle.Standard";
81     private static final String DERIVED_FROM_BASE_DEFAULT = "org.openecomp.interfaces.node.lifecycle.";
82     private static final String DEFAULT_HAS_UNDERSCORE = "_default";
83     private static final String DOT = ".";
84     private static final String DEFAULTP = "defaultp";
85     private static final String LOCAL_INTERFACE_TYPE = "Local";
86     private final PropertyConvertor propertyConvertor;
87
88     @Autowired
89     public InterfacesOperationsConverter(final PropertyConvertor propertyConvertor) {
90         this.propertyConvertor = propertyConvertor;
91     }
92
93     private static Object getDefaultValue(Map<String, Object> inputValueMap) {
94         Object defaultValue = null;
95         for (Map.Entry<String, Object> operationEntry : inputValueMap.entrySet()) {
96             final Object value = operationEntry.getValue();
97             if (value instanceof Map) {
98                 getDefaultValue((Map<String, Object>) value);
99             }
100             final String key = operationEntry.getKey();
101             if (key.equals(DEFAULTP)) {
102                 defaultValue = inputValueMap.remove(key);
103             }
104         }
105         return defaultValue;
106     }
107
108     //Remove input type and copy default value directly into the proxy node template from the node type
109     private static void handleOperationInputValue(Map<String, Object> operationsMap, String parentKey) {
110         for (Map.Entry<String, Object> operationEntry : operationsMap.entrySet()) {
111             final Object value = operationEntry.getValue();
112             final String key = operationEntry.getKey();
113             if (value instanceof Map) {
114                 if (INPUTS.getElementName().equals(parentKey)) {
115                     Object defaultValue = getDefaultValue((Map<String, Object>) value);
116                     operationsMap.put(key, defaultValue);
117                 } else {
118                     handleOperationInputValue((Map<String, Object>) value, key);
119                 }
120             }
121         }
122     }
123
124     private static String getLastPartOfName(String toscaResourceName) {
125         return toscaResourceName.substring(toscaResourceName.lastIndexOf(DOT) + 1);
126     }
127
128     private static String getInputValue(final OperationInputDefinition input) {
129         if (null != input.getToscaFunction()) {
130             return input.getToscaFunction().getJsonObjectValue().toString();
131         }
132         String inputValue = input.getValue() == null ? input.getToscaDefaultValue() : input.getValue();
133         if (inputValue != null && inputValue.contains(ToscaFunctions.GET_OPERATION_OUTPUT.getFunctionName())) {
134             Gson gson = new Gson();
135             Map<String, List<String>> consumptionValue = gson.fromJson(inputValue, Map.class);
136             List<String> mappedOutputValue = consumptionValue.get(ToscaFunctions.GET_OPERATION_OUTPUT.getFunctionName());
137             //Extract the interface name from the interface type
138             String interfaceType = mappedOutputValue.get(1);
139             String interfaceName = interfaceType.substring(interfaceType.lastIndexOf('.') + 1);
140             mappedOutputValue.remove(1);
141             mappedOutputValue.add(1, interfaceName);
142             inputValue = gson.toJson(consumptionValue);
143         }
144         return inputValue;
145     }
146
147     private static String getInterfaceType(Component component, String interfaceType) {
148         if (LOCAL_INTERFACE_TYPE.equals(interfaceType)) {
149             return DERIVED_FROM_BASE_DEFAULT + component.getComponentMetadataDefinition().getMetadataDataDefinition().getSystemName();
150         }
151         return interfaceType;
152     }
153
154     private static Map<String, Object> getObjectAsMap(final Object obj) {
155         final Map<String, Object> objectAsMap;
156         if (obj instanceof Map) {
157             objectAsMap = (Map<String, Object>) obj;
158         } else {
159             final ObjectMapper objectMapper = new ObjectMapper();
160             final SimpleModule module = new SimpleModule("ToscaPropertyAssignmentSerializer");
161             module.addSerializer(ToscaPropertyAssignment.class, new ToscaPropertyAssignmentJsonSerializer());
162             objectMapper.registerModule(module);
163             if (obj instanceof ToscaInterfaceDefinition) {
164                 //Prevent empty field serialization in interface definition
165                 objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
166             }
167             objectAsMap = objectMapper.convertValue(obj, Map.class);
168         }
169
170         final String defaultEntry = DEFAULT.getElementName();
171         if (objectAsMap.containsKey(defaultEntry)) {
172             objectAsMap.put(DEFAULT_HAS_UNDERSCORE, objectAsMap.remove(defaultEntry));
173         }
174         return objectAsMap;
175     }
176
177     /**
178      * Creates the interface_types element.
179      *
180      * @param component to work on
181      * @return the added element
182      */
183     public Map<String, Object> addInterfaceTypeElement(Component component, List<String> allInterfaceTypes) {
184         if (component instanceof Product) {
185             return null;
186         }
187         final Map<String, InterfaceDefinition> interfaces = component.getInterfaces();
188         if (MapUtils.isEmpty(interfaces)) {
189             return null;
190         }
191         Map<String, Object> toscaInterfaceTypes = new HashMap<>();
192         for (InterfaceDefinition interfaceDefinition : interfaces.values()) {
193             boolean isInterfaceTypeExistInGlobalType = allInterfaceTypes.stream()
194                 .anyMatch(type -> type.equalsIgnoreCase(interfaceDefinition.getType()));
195             if (!isInterfaceTypeExistInGlobalType) {
196                 ToscaInterfaceNodeType toscaInterfaceType = new ToscaInterfaceNodeType();
197                 toscaInterfaceType.setDerived_from(DERIVED_FROM_STANDARD_INTERFACE);
198                 final Map<String, OperationDataDefinition> operations = interfaceDefinition.getOperations();
199                 Map<String, Object> toscaOperations = new HashMap<>();
200                 for (Map.Entry<String, OperationDataDefinition> operationEntry : operations.entrySet()) {
201                     toscaOperations.put(operationEntry.getValue().getName(), null);
202                 }
203                 toscaInterfaceType.setOperations(toscaOperations);
204                 Map<String, Object> interfacesAsMap = getObjectAsMap(toscaInterfaceType);
205                 Map<String, Object> operationsMap = (Map<String, Object>) interfacesAsMap.remove(OPERATIONS.getElementName());
206                 interfacesAsMap.putAll(operationsMap);
207                 toscaInterfaceTypes.put(getInterfaceType(component, LOCAL_INTERFACE_TYPE), interfacesAsMap);
208             }
209         }
210         return MapUtils.isNotEmpty(toscaInterfaceTypes) ? toscaInterfaceTypes : null;
211     }
212
213     private boolean isArtifactPresent(final OperationDataDefinition operationDataDefinition) {
214         return operationDataDefinition.getImplementation() != null
215             && StringUtils.isNotEmpty(operationDataDefinition.getImplementation().getArtifactName());
216     }
217
218     /**
219      * Adds the 'interfaces' element to the node type provided.
220      *
221      * @param component to work on
222      * @param nodeType  to which the interfaces element will be added
223      */
224     public void addInterfaceDefinitionElement(Component component, ToscaNodeType nodeType, Map<String, DataTypeDefinition> dataTypes,
225                                               boolean isAssociatedComponent) {
226         if (component instanceof Product) {
227             return;
228         }
229         final Map<String, InterfaceDefinition> interfaces = component.getInterfaces();
230         if (MapUtils.isEmpty(interfaces)) {
231             return;
232         }
233         Map<String, Object> toscaInterfaceDefinitions = getInterfacesMap(component, dataTypes, isAssociatedComponent);
234         if (MapUtils.isNotEmpty(toscaInterfaceDefinitions)) {
235             nodeType.setInterfaces(toscaInterfaceDefinitions);
236         }
237     }
238
239     private Map<String, Object> getInterfacesMap(Component component, Map<String, DataTypeDefinition> dataTypes, boolean isAssociatedComponent) {
240         return getInterfacesMap(component, null, component.getInterfaces(), dataTypes, isAssociatedComponent);
241     }
242
243     public Map<String, Object> getInterfacesMap(final Component component, final ComponentInstance componentInstance,
244                                                 final Map<String, InterfaceDefinition> interfaces, final Map<String, DataTypeDefinition> dataTypes,
245                                                 final boolean isAssociatedComponent) {
246         if (MapUtils.isEmpty(interfaces)) {
247             return null;
248         }
249         final Map<String, Object> toscaInterfaceDefinitions = new HashMap<>();
250         for (InterfaceDefinition interfaceDefinition : interfaces.values()) {
251             handleInterfaceOperations(component, componentInstance, dataTypes, isAssociatedComponent,
252                 toscaInterfaceDefinitions, interfaceDefinition);
253         }
254         return toscaInterfaceDefinitions;
255     }
256
257     public Map<String, Object> getInterfacesMapFromComponentInstance(final Component component, final ComponentInstance componentInstance,
258                                                                      final Map<String, DataTypeDefinition> dataTypes,
259                                                                      final boolean isAssociatedComponent) {
260         final Map<String, Object> toscaInterfaceDefinitions = new HashMap<>();
261         final ObjectMapper objectMapper = new ObjectMapper();
262         objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
263         for (final Map.Entry<String, Object> interfaceEntry : componentInstance.getInterfaces().entrySet()) {
264             final InterfaceDefinition interfaceDefinition = objectMapper.convertValue(interfaceEntry.getValue(), InterfaceDefinition.class);
265             handleInterfaceOperations(component, componentInstance, dataTypes, isAssociatedComponent,
266                 toscaInterfaceDefinitions, interfaceDefinition);
267         }
268         return toscaInterfaceDefinitions;
269     }
270
271     private void handleInterfaceOperations(final Component component, final ComponentInstance componentInstance,
272                                            final Map<String, DataTypeDefinition> dataTypes, final boolean isAssociatedComponent,
273                                            final Map<String, Object> toscaInterfaceDefinitions,
274                                            final InterfaceDefinition interfaceDefinition) {
275         final String interfaceType;
276         if (componentInstance != null && LOCAL_INTERFACE_TYPE.equals(interfaceDefinition.getType())) {
277             interfaceType = DERIVED_FROM_BASE_DEFAULT + componentInstance.getSourceModelName();
278         } else {
279             interfaceType = getInterfaceType(component, interfaceDefinition.getType());
280         }
281         final ToscaInterfaceDefinition toscaInterfaceDefinition = new ToscaInterfaceDefinition();
282         if (componentInstance == null) {
283             toscaInterfaceDefinition.setType(interfaceType);
284         }
285         final Map<String, OperationDataDefinition> operations = interfaceDefinition.getOperations();
286         final Map<String, Object> toscaOperationMap = new HashMap<>();
287         for (final Entry<String, OperationDataDefinition> operationEntry : operations.entrySet()) {
288             if (operationHasAnImplementation(operationEntry.getValue())) {
289                 final ToscaLifecycleOperationDefinition toscaLifecycleOperationDefinition = new ToscaLifecycleOperationDefinition();
290                 handleInterfaceOperationImplementation(component, componentInstance, isAssociatedComponent, operationEntry.getValue(),
291                     toscaLifecycleOperationDefinition, dataTypes);
292                 if (StringUtils.isNotEmpty(operationEntry.getValue().getDescription())) {
293                     toscaLifecycleOperationDefinition.setDescription(operationEntry.getValue().getDescription());
294                 }
295                 fillToscaOperationInputs(operationEntry.getValue(), dataTypes, toscaLifecycleOperationDefinition);
296                 fillToscaOperationMilestones(operationEntry.getValue(), dataTypes, toscaLifecycleOperationDefinition);
297                 toscaOperationMap.put(operationEntry.getValue().getName(), toscaLifecycleOperationDefinition);
298             }
299         }
300         toscaInterfaceDefinition.setOperations(toscaOperationMap);
301         final Map<String, Object> interfaceInputMap = createInterfaceInputMap(interfaceDefinition, dataTypes);
302         if (MapUtils.isNotEmpty(interfaceInputMap)) {
303             toscaInterfaceDefinition.setInputs(interfaceInputMap);
304         }
305         final Map<String, Object> interfaceDefinitionAsMap = getObjectAsMap(toscaInterfaceDefinition);
306         if (interfaceDefinitionAsMap.containsKey(INPUTS.getElementName())) {
307             handleDefaults((Map<String, Object>) interfaceDefinitionAsMap.get(INPUTS.getElementName()));
308         }
309         final Map<String, Object> operationsMap = (Map<String, Object>) interfaceDefinitionAsMap.remove(OPERATIONS.getElementName());
310         handleOperationInputValue(operationsMap, interfaceType);
311         interfaceDefinitionAsMap.putAll(operationsMap);
312         toscaInterfaceDefinitions.put(getLastPartOfName(interfaceType), interfaceDefinitionAsMap);
313     }
314
315     private void fillToscaOperationMilestones(OperationDataDefinition operation, Map<String, DataTypeDefinition> dataTypes,
316                                               ToscaLifecycleOperationDefinition toscaOperation) {
317         if (Objects.isNull(operation.getMilestones()) || operation.getMilestones().isEmpty()) {
318             toscaOperation.setMilestones(null);
319             return;
320         }
321         Map<String, ToscaMilestone> toscaMilestones = new HashMap<>();
322         for (Entry<String, MilestoneDataDefinition> milestone : operation.getMilestones().entrySet()) {
323             ListDataDefinition<ActivityDataDefinition> activities = milestone.getValue().getActivities();
324             if (MilestoneTypeEnum.getEnum(milestone.getKey()).isEmpty() || activities == null || activities.isEmpty()) {
325                 continue;
326             }
327             List<Map<String, ToscaActivity>> toscaActivities = new ArrayList<>();
328             for (ActivityDataDefinition activity : activities.getListToscaDataDefinition()) {
329                 if (ActivityTypeEnum.getEnum(activity.getType()).isEmpty()) {
330                     continue;
331                 }
332                 Map<String, ToscaActivity> toscaActivityMap = new HashMap<>();
333                 ToscaActivity toscaActivity = new ToscaActivity();
334                 toscaActivity.setWorkflow(activity.getWorkflow());
335                 toscaActivityMap.put(activity.getType(), toscaActivity);
336                 toscaActivities.add(toscaActivityMap);
337             }
338             ToscaMilestone toscaMilestone = new ToscaMilestone();
339             toscaMilestone.setActivities(toscaActivities);
340             toscaMilestones.put(milestone.getKey(), toscaMilestone);
341         }
342         toscaOperation.setMilestones(toscaMilestones);
343     }
344
345     private boolean operationHasAnImplementation(OperationDataDefinition operation) {
346         return operation.getImplementation() != null && StringUtils.isNotEmpty(operation.getImplementation().getArtifactName()) &&
347             !operation.getImplementation().getArtifactName().equals("''");
348     }
349
350     private void handleInterfaceOperationImplementation(final Component component, final ComponentInstance componentInstance,
351                                                         final boolean isAssociatedComponent,
352                                                         final OperationDataDefinition operationDataDefinition,
353                                                         final ToscaLifecycleOperationDefinition toscaOperation,
354                                                         final Map<String, DataTypeDefinition> dataTypes) {
355         final ArtifactDataDefinition implementation = operationDataDefinition.getImplementation();
356         if (implementation == null) {
357             return;
358         }
359
360         if (isArtifactPresent(operationDataDefinition)) {
361             final String operationArtifactPath =
362                 OperationArtifactUtil.createOperationArtifactPath(component, componentInstance, operationDataDefinition, isAssociatedComponent);
363             final ToscaInterfaceOperationImplementation toscaInterfaceOperationImplementation = new ToscaInterfaceOperationImplementation();
364             if (implementation.getTimeout() != null && implementation.getTimeout() > 0) {
365                 toscaInterfaceOperationImplementation.setTimeout(implementation.getTimeout());
366             }
367             if (implementation.getArtifactType() != null) {
368                 final ToscaArtifactDefinition toscaArtifactDefinition = new ToscaArtifactDefinition();
369                 toscaArtifactDefinition.setFile(operationArtifactPath);
370                 final String artifactVersion = implementation.getArtifactVersion();
371                 toscaArtifactDefinition.setArtifact_version(!artifactVersion.equals(NumberUtils.INTEGER_ZERO.toString()) ? artifactVersion : null);
372                 toscaArtifactDefinition.setType(implementation.getArtifactType());
373                 final Map<String, ToscaPropertyAssignment> propertiesMap = handleImplementationProperties(operationDataDefinition, dataTypes);
374                 if (MapUtils.isNotEmpty(propertiesMap)) {
375                     toscaArtifactDefinition.setProperties(propertiesMap);
376                 }
377                 toscaInterfaceOperationImplementation.setPrimary(toscaArtifactDefinition);
378                 toscaOperation.setImplementation(toscaInterfaceOperationImplementation);
379             } else {
380                 if (toscaInterfaceOperationImplementation.getTimeout() != null) {
381                     final ToscaArtifactDefinition toscaArtifactDefinition = new ToscaArtifactDefinition();
382                     toscaArtifactDefinition.setFile(StringUtils.isBlank(operationArtifactPath) || "null".equals(operationArtifactPath) ? null : operationArtifactPath);
383                     toscaInterfaceOperationImplementation.setPrimary(toscaArtifactDefinition);
384                     toscaOperation.setImplementation(toscaInterfaceOperationImplementation);
385                 } else {
386                     toscaOperation.setImplementation(
387                         StringUtils.isBlank(operationArtifactPath) || "null".equals(operationArtifactPath) ? null : operationArtifactPath);
388                 }
389             }
390         }
391     }
392
393     private Map<String, ToscaPropertyAssignment> handleImplementationProperties(final OperationDataDefinition operationDataDefinition,
394                                                                                 final Map<String, DataTypeDefinition> dataTypes) {
395         if (operationDataDefinition.getImplementation() == null) {
396             return new HashMap<>();
397         }
398
399         final List<PropertyDataDefinition> properties = operationDataDefinition.getImplementation().getProperties();
400         if (CollectionUtils.isEmpty(properties)) {
401             return new HashMap<>();
402         }
403
404         final Map<String, ToscaPropertyAssignment> propertiesMap = new HashMap<>();
405         properties.stream()
406             .filter(propertyDataDefinition -> StringUtils.isNotEmpty(propertyDataDefinition.getValue()))
407             .forEach(propertyDataDefinition -> {
408                     final String propertyValue =
409                         propertyDataDefinition.getValue() != null ? propertyDataDefinition.getValue() : propertyDataDefinition.getDefaultValue();
410                     final ToscaPropertyAssignment toscaPropertyAssignment = new ToscaPropertyAssignment();
411                     toscaPropertyAssignment.setValue(propertyConvertor.convertToToscaObject(propertyDataDefinition, propertyValue, dataTypes, false));
412                     propertiesMap.put(propertyDataDefinition.getName(), toscaPropertyAssignment);
413                 }
414             );
415
416         return propertiesMap;
417     }
418
419     public void removeInterfacesWithoutOperations(final Map<String, Object> interfaceMap) {
420         if (MapUtils.isEmpty(interfaceMap)) {
421             return;
422         }
423         final Set<String> emptyInterfaces = interfaceMap.entrySet().stream().filter(entry -> {
424             final Object value = entry.getValue();
425             if (value instanceof ToscaInterfaceDefinition) {
426                 final ToscaInterfaceDefinition interfaceDefinition = (ToscaInterfaceDefinition) value;
427                 return MapUtils.isEmpty(interfaceDefinition.getOperations());
428             } else if (value instanceof Map) {
429                 final Map<String, Object> interfaceDefMap = (Map<String, Object>) value;
430                 return MapUtils.isEmpty(interfaceDefMap);
431             }
432             return false;
433         }).map(Entry::getKey).collect(Collectors.toSet());
434         emptyInterfaces.forEach(interfaceMap::remove);
435     }
436
437     private Map<String, Object> createInterfaceInputMap(final InterfaceDefinition interfaceDefinition,
438                                                         final Map<String, DataTypeDefinition> allDataTypeMap) {
439         final Map<String, InputDataDefinition> inputMap = interfaceDefinition.getInputs();
440         if (MapUtils.isEmpty(inputMap)) {
441             return Collections.emptyMap();
442         }
443         final Map<String, Object> toscaInterfaceInputMap = new HashMap<>();
444         for (final Entry<String, InputDataDefinition> inputEntry : inputMap.entrySet()) {
445             final InputDataDefinition inputDataDefinition = inputEntry.getValue();
446             final ToscaProperty toscaProperty = propertyConvertor
447                 .convertProperty(allDataTypeMap, new PropertyDefinition(inputDataDefinition), PropertyType.INPUT);
448             toscaInterfaceInputMap.put(inputEntry.getKey(), new ToscaInput(toscaProperty));
449         }
450         return toscaInterfaceInputMap;
451     }
452
453     /*
454      * workaround for : currently "defaultp" is not being converted to "default" by the relevant code in
455      * ToscaExportHandler so, any string Map key named "defaultp" will have its named changed to "default"
456      * @param operationsMap the map to update
457      */
458     private void handleDefaults(Map<String, Object> operationsMap) {
459         for (Map.Entry<String, Object> operationEntry : operationsMap.entrySet()) {
460             final Object value = operationEntry.getValue();
461             if (value instanceof Map) {
462                 handleDefaults((Map<String, Object>) value);
463             }
464             final String key = operationEntry.getKey();
465             if (key.equals(DEFAULTP)) {
466                 Object removed = operationsMap.remove(key);
467                 operationsMap.put(ToscaTagNamesEnum.DEFAULT.getElementName(), removed);
468             }
469         }
470     }
471
472     private void fillToscaOperationInputs(OperationDataDefinition operation, Map<String, DataTypeDefinition> dataTypes,
473                                           ToscaLifecycleOperationDefinition toscaOperation) {
474         if (Objects.isNull(operation.getInputs()) || operation.getInputs().isEmpty()) {
475             toscaOperation.setInputs(null);
476             return;
477         }
478         Map<String, ToscaProperty> toscaInputs = new HashMap<>();
479         for (OperationInputDefinition input : operation.getInputs().getListToscaDataDefinition()) {
480             ToscaProperty toscaInput = new ToscaProperty();
481             toscaInput.setDescription(input.getDescription());
482             toscaInput.setType(input.getType());
483             toscaInput.setRequired(input.isRequired());
484             toscaInput.setDefaultp(propertyConvertor.convertToToscaObject(input, getInputValue(input), dataTypes, false));
485             toscaInputs.put(input.getName(), toscaInput);
486         }
487         toscaOperation.setInputs(toscaInputs);
488     }
489
490 }