Fix bugs in attribute outputs page
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / attribute / ComponentInstanceAttributeDeclarator.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2021, Nordix Foundation. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.sdc.be.components.attribute;
22
23 import fj.data.Either;
24 import java.util.Collections;
25 import java.util.List;
26 import java.util.Map;
27 import java.util.Optional;
28 import org.apache.commons.collections4.CollectionUtils;
29 import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
30 import org.openecomp.sdc.be.datatypes.elements.AttributeDataDefinition;
31 import org.openecomp.sdc.be.datatypes.elements.GetOutputValueDataDefinition;
32 import org.openecomp.sdc.be.model.Component;
33 import org.openecomp.sdc.be.model.ComponentInstance;
34 import org.openecomp.sdc.be.model.ComponentInstanceAttribute;
35 import org.openecomp.sdc.be.model.OutputDefinition;
36 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
37 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
38 import org.openecomp.sdc.common.log.wrappers.Logger;
39
40 @org.springframework.stereotype.Component
41 public class ComponentInstanceAttributeDeclarator extends DefaultAttributeDeclarator<ComponentInstance, ComponentInstanceAttribute> {
42
43     private static final Logger log = Logger.getLogger(ComponentInstanceAttributeDeclarator.class);
44     private ToscaOperationFacade toscaOperationFacade;
45     private ComponentInstanceBusinessLogic componentInstanceBusinessLogic;
46
47     public ComponentInstanceAttributeDeclarator(final ToscaOperationFacade toscaOperationFacade,
48                                                 final ComponentInstanceBusinessLogic componentInstanceBusinessLogic) {
49         this.toscaOperationFacade = toscaOperationFacade;
50         this.componentInstanceBusinessLogic = componentInstanceBusinessLogic;
51     }
52
53     @Override
54     public ComponentInstanceAttribute createDeclaredAttribute(AttributeDataDefinition attributeDataDefinition) {
55         return new ComponentInstanceAttribute(attributeDataDefinition);
56     }
57
58     @Override
59     public Either<?, StorageOperationStatus> updateAttributesValues(final Component component, final String cmptInstanceId,
60                                                                     final List<ComponentInstanceAttribute> attributetypeList) {
61         log.debug("#updateAttributesValues - updating component instance attributes for instance {} on component {}", cmptInstanceId,
62             component.getUniqueId());
63         Map<String, List<ComponentInstanceAttribute>> instAttributes = Collections.singletonMap(cmptInstanceId, attributetypeList);
64         return toscaOperationFacade.addComponentInstanceAttributesToComponent(component, instAttributes);
65     }
66
67     @Override
68     public Optional<ComponentInstance> resolvePropertiesOwner(final Component component, final String propertiesOwnerId) {
69         log.debug("#resolvePropertiesOwner - fetching component instance {} of component {}", propertiesOwnerId, component.getUniqueId());
70         return component.getComponentInstanceById(propertiesOwnerId);
71     }
72
73     @Override
74     public StorageOperationStatus unDeclareAttributesAsOutputs(final Component component, final OutputDefinition output) {
75         final List<ComponentInstanceAttribute> componentInstanceAttributesDeclaredAsOutput = componentInstanceBusinessLogic
76             .getComponentInstanceAttributesByOutputId(component, output.getUniqueId());
77         if (CollectionUtils.isEmpty(componentInstanceAttributesDeclaredAsOutput)) {
78             return StorageOperationStatus.OK;
79         }
80         unDeclareOutput(output, componentInstanceAttributesDeclaredAsOutput);
81         return toscaOperationFacade
82             .updateComponentInstanceAttributes(component, componentInstanceAttributesDeclaredAsOutput.get(0).getComponentInstanceId(),
83                 componentInstanceAttributesDeclaredAsOutput);
84     }
85
86     private void unDeclareOutput(OutputDefinition output,
87                                  List<ComponentInstanceAttribute> componentInstanceAttributesDeclaredAsOutput) {
88         componentInstanceAttributesDeclaredAsOutput.forEach(attribute -> {
89             Optional<GetOutputValueDataDefinition> attributeOutput =
90                 attribute.getGetOutputValues().stream().filter(attOut -> output.getUniqueId().equals(attOut.getOutputId())).findFirst();
91             if (attributeOutput.isPresent()) {
92                 attribute.getGetOutputValues().remove(attributeOutput.get());
93             }
94         });
95     }
96 }