Implement Attributes/Outputs BE (part 2)
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / attribute / AttributeDeclarationOrchestrator.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 static org.apache.commons.collections.MapUtils.isNotEmpty;
24
25 import fj.data.Either;
26 import java.util.Arrays;
27 import java.util.List;
28 import org.apache.commons.lang3.tuple.Pair;
29 import org.openecomp.sdc.be.model.Component;
30 import org.openecomp.sdc.be.model.ComponentInstOutputsMap;
31 import org.openecomp.sdc.be.model.ComponentInstanceAttribOutput;
32 import org.openecomp.sdc.be.model.OutputDefinition;
33 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
34 import org.openecomp.sdc.common.log.wrappers.Logger;
35
36 @org.springframework.stereotype.Component("attributeDeclarationOrchestrator")
37 public class AttributeDeclarationOrchestrator {
38
39     private static final Logger log = Logger.getLogger(AttributeDeclarationOrchestrator.class);
40     private final ComponentInstanceOutputAttributeDeclarator componentInstanceOutputAttributeDeclarator;
41     private final ComponentInstanceAttributeDeclarator componentInstanceAttributeDeclarator;
42     private final List<AttributeDeclarator> attributeDeclaratorsToOutput;
43
44     public AttributeDeclarationOrchestrator(final ComponentInstanceOutputAttributeDeclarator componentInstanceOutputAttributeDeclarator,
45                                             final ComponentInstanceAttributeDeclarator componentInstanceAttributeDeclarator) {
46         this.componentInstanceOutputAttributeDeclarator = componentInstanceOutputAttributeDeclarator;
47         this.componentInstanceAttributeDeclarator = componentInstanceAttributeDeclarator;
48         attributeDeclaratorsToOutput = Arrays.asList(componentInstanceOutputAttributeDeclarator, componentInstanceAttributeDeclarator);
49     }
50
51     public Either<List<OutputDefinition>, StorageOperationStatus> declareAttributesToOutputs(final Component component,
52                                                                                              final ComponentInstOutputsMap componentInstOutputsMap) {
53         AttributeDeclarator attributeDeclarator = getAttributeDeclarator(componentInstOutputsMap);
54         Pair<String, List<ComponentInstanceAttribOutput>> attributesToDeclare = componentInstOutputsMap.resolveAttributesToDeclare();
55         return attributeDeclarator.declareAttributesAsOutputs(component, attributesToDeclare.getLeft(), attributesToDeclare.getRight());
56     }
57
58     public StorageOperationStatus unDeclareAttributesAsOutputs(final Component component,
59                                                                final OutputDefinition outputToDelete) {
60         log.debug("#unDeclareAttributesAsOutputs - removing output declaration for output {} on component {}", outputToDelete.getName(),
61             component.getUniqueId());
62         for (final AttributeDeclarator attributeDeclarator : attributeDeclaratorsToOutput) {
63             final StorageOperationStatus storageOperationStatus = attributeDeclarator.unDeclareAttributesAsOutputs(component, outputToDelete);
64             if (StorageOperationStatus.OK != storageOperationStatus) {
65                 log.debug("#unDeclareAttributesAsOutputs - failed to remove output declaration for output {} on component {}. reason {}",
66                     outputToDelete.getName(), component.getUniqueId(), storageOperationStatus);
67                 return storageOperationStatus;
68             }
69         }
70         return StorageOperationStatus.OK;
71
72     }
73
74     private AttributeDeclarator getAttributeDeclarator(final ComponentInstOutputsMap componentInstOutputsMap) {
75         if (isNotEmpty(componentInstOutputsMap.getComponentInstanceOutputsMap())) {
76             return componentInstanceOutputAttributeDeclarator;
77         }
78         if (isNotEmpty(componentInstOutputsMap.getComponentInstanceAttributes())) {
79             return componentInstanceAttributeDeclarator;
80         }
81         throw new IllegalStateException("there are no properties selected for declaration");
82
83     }
84
85 }