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