Added oparent to sdc main
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / property / PropertyDeclarationOrchestrator.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2019 AT&T Intellectual Property. 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.property;
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.components.property.propertytopolicydeclarators.ComponentInstancePropertyToPolicyDeclarator;
30 import org.openecomp.sdc.be.components.property.propertytopolicydeclarators.ComponentPropertyToPolicyDeclarator;
31 import org.openecomp.sdc.be.model.Component;
32 import org.openecomp.sdc.be.model.ComponentInstInputsMap;
33 import org.openecomp.sdc.be.model.ComponentInstancePropInput;
34 import org.openecomp.sdc.be.model.InputDefinition;
35 import org.openecomp.sdc.be.model.PolicyDefinition;
36 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
37 import org.openecomp.sdc.common.log.wrappers.Logger;
38
39 @org.springframework.stereotype.Component
40 public class PropertyDeclarationOrchestrator {
41
42     private static final Logger log = Logger.getLogger(PropertyDeclarationOrchestrator.class);
43     private ComponentInstanceInputPropertyDeclarator componentInstanceInputPropertyDeclarator;
44     private ComponentInstancePropertyDeclarator componentInstancePropertyDeclarator;
45     private PolicyPropertyDeclarator policyPropertyDeclarator;
46     private GroupPropertyDeclarator groupPropertyDeclarator;
47     private ComponentPropertyDeclarator servicePropertyDeclarator;
48     private List<PropertyDeclarator> propertyDeclaratorsToInput;
49     private List<PropertyDeclarator> propertyDeclaratorsToPolicy;
50     private ComponentPropertyToPolicyDeclarator componentPropertyToPolicyDeclarator;
51     private ComponentInstancePropertyToPolicyDeclarator componentInstancePropertyToPolicyDeclarator;
52
53     public PropertyDeclarationOrchestrator(ComponentInstanceInputPropertyDeclarator componentInstanceInputPropertyDeclarator,
54             ComponentInstancePropertyDeclarator componentInstancePropertyDeclarator, PolicyPropertyDeclarator policyPropertyDeclarator,
55             GroupPropertyDeclarator groupPropertyDeclarator, ComponentPropertyDeclarator servicePropertyDeclarator,
56             ComponentPropertyToPolicyDeclarator componentPropertyToPolicyDeclarator,
57             ComponentInstancePropertyToPolicyDeclarator componentInstancePropertyToPolicyDeclarator) {
58         this.componentInstanceInputPropertyDeclarator = componentInstanceInputPropertyDeclarator;
59         this.componentInstancePropertyDeclarator = componentInstancePropertyDeclarator;
60         this.policyPropertyDeclarator = policyPropertyDeclarator;
61         this.groupPropertyDeclarator = groupPropertyDeclarator;
62         this.servicePropertyDeclarator = servicePropertyDeclarator;
63         this.componentPropertyToPolicyDeclarator = componentPropertyToPolicyDeclarator;
64         this.componentInstancePropertyToPolicyDeclarator = componentInstancePropertyToPolicyDeclarator;
65         propertyDeclaratorsToInput = Arrays.asList(componentInstanceInputPropertyDeclarator, componentInstancePropertyDeclarator, policyPropertyDeclarator, groupPropertyDeclarator, servicePropertyDeclarator);
66         propertyDeclaratorsToPolicy = Arrays.asList(componentPropertyToPolicyDeclarator, componentInstancePropertyToPolicyDeclarator);
67     }
68
69     public Either<List<InputDefinition>, StorageOperationStatus> declarePropertiesToInputs(Component component, ComponentInstInputsMap componentInstInputsMap) {
70         PropertyDeclarator propertyDeclarator = getPropertyDeclarator(componentInstInputsMap);
71         Pair<String, List<ComponentInstancePropInput>> propsToDeclare = componentInstInputsMap.resolvePropertiesToDeclare();
72         return propertyDeclarator.declarePropertiesAsInputs(component, propsToDeclare.getLeft(), propsToDeclare.getRight());
73     }
74
75     public Either<List<PolicyDefinition>, StorageOperationStatus> declarePropertiesToPolicies(Component component, ComponentInstInputsMap componentInstInputsMap) {
76         PropertyDeclarator propertyDeclarator = getPropertyDeclarator(componentInstInputsMap);
77         Pair<String, List<ComponentInstancePropInput>> propsToDeclare = componentInstInputsMap.resolvePropertiesToDeclare();
78         return propertyDeclarator.declarePropertiesAsPolicies(component, propsToDeclare.getLeft(), propsToDeclare.getRight());
79     }
80
81     /**
82      *
83      * @param component
84      * @param componentInstInputsMap
85      * @param input
86      * @return
87      */
88     public Either<InputDefinition, StorageOperationStatus> declarePropertiesToListInput(Component component, ComponentInstInputsMap componentInstInputsMap, InputDefinition input) {
89         PropertyDeclarator propertyDeclarator = getPropertyDeclarator(componentInstInputsMap);
90         Pair<String, List<ComponentInstancePropInput>> propsToDeclare = componentInstInputsMap.resolvePropertiesToDeclare();
91         log.debug("#declarePropertiesToInputs: componentId={}, propOwnerId={}", component.getUniqueId(), propsToDeclare.getLeft());
92         return propertyDeclarator.declarePropertiesAsListInput(component, propsToDeclare.getLeft(), propsToDeclare.getRight(), input);
93     }
94
95     public StorageOperationStatus unDeclarePropertiesAsInputs(Component component, InputDefinition inputToDelete) {
96         log.debug("#unDeclarePropertiesAsInputs - removing input declaration for input {} on component {}", inputToDelete.getName(), component.getUniqueId());
97         for (PropertyDeclarator propertyDeclarator : propertyDeclaratorsToInput) {
98             StorageOperationStatus storageOperationStatus = propertyDeclarator.unDeclarePropertiesAsInputs(component, inputToDelete);
99             if (StorageOperationStatus.OK != storageOperationStatus) {
100                 log.debug("#unDeclarePropertiesAsInputs - failed to remove input declaration for input {} on component {}. reason {}", inputToDelete.getName(), component.getUniqueId(), storageOperationStatus);
101                 return storageOperationStatus;
102             }
103         }
104         return StorageOperationStatus.OK;
105
106     }
107     /**
108      * Un declare properties declared as list type input
109      *
110      * @param component
111      * @param inputToDelete
112      * @return
113      */
114     public StorageOperationStatus unDeclarePropertiesAsListInputs(Component component, InputDefinition inputToDelete) {
115         log.debug("#unDeclarePropertiesAsListInputs - removing input declaration for input {} on component {}", inputToDelete.getName(), component.getUniqueId());
116         for (PropertyDeclarator propertyDeclarator : propertyDeclaratorsToInput) {
117             StorageOperationStatus storageOperationStatus = propertyDeclarator.unDeclarePropertiesAsListInputs(component, inputToDelete);
118             if (StorageOperationStatus.OK != storageOperationStatus) {
119                 log.debug("#unDeclarePropertiesAsListInputs - failed to remove input declaration for input {} on component {}. reason {}", inputToDelete.getName(), component.getUniqueId(), storageOperationStatus);
120                 return storageOperationStatus;
121             }
122         }
123         return StorageOperationStatus.OK;
124
125     }
126
127     /**
128      * Get properties owner id
129      *
130      * @param componentInstInputsMap
131      * @return
132      */
133     public String getPropOwnerId(ComponentInstInputsMap componentInstInputsMap) {
134         Pair<String, List<ComponentInstancePropInput>> propsToDeclare = componentInstInputsMap.resolvePropertiesToDeclare();
135         return propsToDeclare.getLeft();
136     }
137
138     public StorageOperationStatus unDeclarePropertiesAsPolicies(Component component, PolicyDefinition policyToDelete) {
139         log.debug("#unDeclarePropertiesAsInputs - removing policy declaration for input {} on component {}", policyToDelete
140                                                                                                                      .getName(), component.getUniqueId());
141         for(PropertyDeclarator propertyDeclarator : propertyDeclaratorsToPolicy) {
142             StorageOperationStatus storageOperationStatus =
143                     propertyDeclarator.unDeclarePropertiesAsPolicies(component, policyToDelete);
144             if (StorageOperationStatus.OK != storageOperationStatus) {
145                 log.debug("#unDeclarePropertiesAsInputs - failed to remove policy declaration for policy {} on component {}. reason {}", policyToDelete
146                                                                                                                                                  .getName(), component.getUniqueId(), storageOperationStatus);
147                 return storageOperationStatus;
148             }
149         }
150
151         return StorageOperationStatus.OK;
152
153     }
154
155     private PropertyDeclarator getPropertyDeclarator(ComponentInstInputsMap componentInstInputsMap) {
156         if (isNotEmpty(componentInstInputsMap.getComponentInstanceInputsMap())) {
157             return componentInstanceInputPropertyDeclarator;
158         }
159         if (isNotEmpty(componentInstInputsMap.getComponentInstanceProperties())) {
160             return componentInstancePropertyDeclarator;
161         }
162         if (isNotEmpty(componentInstInputsMap.getPolicyProperties())) {
163             return policyPropertyDeclarator;
164         }
165         if (isNotEmpty(componentInstInputsMap.getGroupProperties())) {
166             return groupPropertyDeclarator;
167         }
168         if(isNotEmpty(componentInstInputsMap.getServiceProperties())) {
169             return servicePropertyDeclarator;
170         }
171         if(isNotEmpty(componentInstInputsMap.getComponentPropertiesToPolicies())) {
172             return componentPropertyToPolicyDeclarator;
173         }
174         if(isNotEmpty(componentInstInputsMap.getComponentInstancePropertiesToPolicies())) {
175             return componentInstancePropertyToPolicyDeclarator;
176         }
177         throw new IllegalStateException("there are no properties selected for declaration");
178
179     }
180
181 }