Service Consumption BE
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / merge / instance / ComponentInstanceInterfacesMerge.java
1 package org.openecomp.sdc.be.components.merge.instance;
2
3 import fj.data.Either;
4 import java.util.List;
5 import org.apache.commons.collections.CollectionUtils;
6 import org.apache.commons.collections.MapUtils;
7 import org.openecomp.sdc.be.dao.api.ActionStatus;
8 import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition;
9 import org.openecomp.sdc.be.datatypes.elements.OperationInputDefinition;
10 import org.openecomp.sdc.be.impl.ComponentsUtils;
11 import org.openecomp.sdc.be.model.Component;
12 import org.openecomp.sdc.be.model.ComponentInstance;
13 import org.openecomp.sdc.be.model.ComponentInstanceInterface;
14 import org.openecomp.sdc.be.model.User;
15 import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
16 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
17 import org.openecomp.sdc.exception.ResponseFormat;
18 import org.springframework.beans.factory.annotation.Autowired;
19
20 @org.springframework.stereotype.Component("ComponentInstanceInterfacesMerge")
21 public class ComponentInstanceInterfacesMerge implements ComponentInstanceMergeInterface {
22
23     @Autowired
24     private ComponentsUtils componentsUtils;
25
26     @Autowired
27     private ToscaOperationFacade toscaOperationFacade;
28
29     @Override
30     public void saveDataBeforeMerge(DataForMergeHolder dataHolder, Component containerComponent, ComponentInstance currentResourceInstance, Component originComponent) {
31         dataHolder.setOrigInstanceNode(originComponent);
32         dataHolder.setOrigComponentInstanceInterfaces(containerComponent.safeGetComponentInstanceInterfaces(currentResourceInstance.getUniqueId()));
33     }
34
35     @Override
36     public Either<Component, ResponseFormat> mergeDataAfterCreate(User user, DataForMergeHolder dataHolder, Component updatedContainerComponent, String newInstanceId) {
37         List<ComponentInstanceInterface> origInstanceInterfaces = dataHolder.getOrigComponentInstanceInterfaces();
38         ActionStatus mergeStatus = mergeComponentInstanceInterfaces(updatedContainerComponent, newInstanceId, origInstanceInterfaces);
39         return Either.iif(!ActionStatus.OK.equals(mergeStatus), () -> componentsUtils.getResponseFormat(mergeStatus), () -> updatedContainerComponent);
40     }
41
42     private ActionStatus mergeComponentInstanceInterfaces(Component currentComponent, String instanceId, List<ComponentInstanceInterface> prevInstanceInterfaces) {
43         if (CollectionUtils.isEmpty(prevInstanceInterfaces) || MapUtils.isEmpty(currentComponent.getComponentInstancesInterfaces())) {
44             return ActionStatus.OK;
45         }
46
47         if(CollectionUtils.isEmpty(currentComponent.getComponentInstancesInterfaces().get(instanceId))){
48             return ActionStatus.OK;
49         }
50
51         currentComponent.getComponentInstancesInterfaces().get(instanceId).stream()
52             .forEach(newInterfaceDef -> newInterfaceDef.getOperationsMap().values()
53                 .forEach(newOperationDef -> prevInstanceInterfaces.stream().filter(in -> in.getUniqueId().equals(newInterfaceDef.getUniqueId()))
54                     .forEach(prevInterfaceDef -> prevInterfaceDef.getOperationsMap().values().stream().filter(in1 -> in1.getUniqueId().equals(newOperationDef.getUniqueId()))
55                         .forEach(oldOperationDef -> mergeOperationInputDefinitions(oldOperationDef.getInputs(), newOperationDef.getInputs())))));
56
57         StorageOperationStatus updateStatus = toscaOperationFacade.updateComponentInstanceInterfaces(currentComponent, instanceId);
58         return componentsUtils.convertFromStorageResponse(updateStatus);
59     }
60
61
62     private void mergeOperationInputDefinitions(ListDataDefinition<OperationInputDefinition> origInputs, ListDataDefinition<OperationInputDefinition> newInputs){
63         newInputs.getListToscaDataDefinition()
64             .forEach(inp -> origInputs.getListToscaDataDefinition().stream().filter(in -> in.getInputId().equals(inp.getInputId()))
65                 .forEach(in -> {
66                     inp.setSourceProperty(in.getSourceProperty());
67                     inp.setSource(in.getSource());
68                     inp.setValue(in.getValue());
69                 }));
70     }
71
72 }