Maintain VFC instance attribute outputs on instance version change
[sdc.git] / catalog-be / src / test / java / org / openecomp / sdc / be / components / utils / ComponentBuilder.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.utils;
22
23 import org.openecomp.sdc.be.dao.utils.MapUtil;
24 import org.openecomp.sdc.be.datatypes.elements.GetInputValueDataDefinition;
25 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
26 import org.openecomp.sdc.be.model.Component;
27 import org.openecomp.sdc.be.model.ComponentInstance;
28 import org.openecomp.sdc.be.model.ComponentInstanceAttribute;
29 import org.openecomp.sdc.be.model.ComponentInstanceInput;
30 import org.openecomp.sdc.be.model.ComponentInstanceOutput;
31 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
32 import org.openecomp.sdc.be.model.GroupDefinition;
33 import org.openecomp.sdc.be.model.InputDefinition;
34 import org.openecomp.sdc.be.model.LifecycleStateEnum;
35 import org.openecomp.sdc.be.model.OutputDefinition;
36 import org.openecomp.sdc.be.model.PolicyDefinition;
37 import org.openecomp.sdc.be.model.RequirementCapabilityRelDef;
38
39 import java.util.ArrayList;
40 import java.util.HashMap;
41 import java.util.List;
42 import java.util.Map;
43
44 public abstract class ComponentBuilder<T extends Component, B extends ComponentBuilder<T, B>> {
45
46     private T component;
47
48     protected abstract T component();
49
50     protected abstract ComponentBuilder<T, B> self();
51
52     public ComponentBuilder() {
53         this.component = component();
54     }
55
56     public ComponentBuilder(T component) {
57         this.component = component;
58     }
59
60     public ComponentBuilder<T, B> setUniqueId(String id) {
61         component.setUniqueId(id);
62         return self();
63     }
64
65     public ComponentBuilder<T, B> setLifeCycleState(LifecycleStateEnum lifeCycleState) {
66         component.setLifecycleState(lifeCycleState);
67         return self();
68     }
69
70     public ComponentBuilder<T, B> setLastUpdaterUserId(String lastUpdater) {
71         component.setLastUpdaterUserId(lastUpdater);
72         return self();
73     }
74
75     public ComponentBuilder<T, B> setInvariantUUid(String invariantUUid) {
76         component.setInvariantUUID(invariantUUid);
77         return self();
78     }
79
80     public ComponentBuilder<T, B> setName(String name) {
81         component.setName(name);
82         return self();
83     }
84
85     public ComponentBuilder<T, B> setComponentType(ComponentTypeEnum type) {
86         component.setComponentType(type);
87         return self();
88     }
89
90     public ComponentBuilder<T, B> setSystemName(String systemName) {
91         component.setSystemName(systemName);
92         return self();
93     }
94
95     public ComponentBuilder<T, B> addComponentInstance(String instanceName) {
96         ComponentInstance instance = new ComponentInstanceBuilder()
97                 .setUniqueId(instanceName)
98                 .setName(instanceName)
99                 .build();
100         return addComponentInstance(instance);
101     }
102     
103     public ComponentBuilder<T, B> addComponentInstance(String instanceName, String uniqueId) {
104         ComponentInstance instance = new ComponentInstanceBuilder()
105                 .setUniqueId(uniqueId)
106                 .setName(instanceName)
107                 .build();
108         return addComponentInstance(instance);
109     }
110
111     public ComponentBuilder<T, B> addComponentInstance(ComponentInstance componentInstance) {
112         initInstances();
113         component.getComponentInstances().add(componentInstance);
114         return self();
115     }
116
117     private void initInstances() {
118         if (component.getComponentInstances() == null) {
119             component.setComponentInstances(new ArrayList<>());
120         }
121     }
122
123     public ComponentBuilder<T, B> addInput(InputDefinition input) {
124         if (component.getInputs() == null) {
125             component.setInputs(new ArrayList<>());
126         }
127         component.getInputs().add(input);
128         return self();
129     }
130
131     public ComponentBuilder<T, B> addInput(String inputName) {
132         InputDefinition inputDefinition = new InputDefinition();
133         inputDefinition.setName(inputName);
134         inputDefinition.setUniqueId(inputName);
135         this.addInput(inputDefinition);
136         return self();
137     }
138
139     public ComponentBuilder<T, B> addOutput(final OutputDefinition output) {
140         if (component.getOutputs() == null) {
141             component.setOutputs(new ArrayList<>());
142         }
143         component.getOutputs().add(output);
144         return self();
145     }
146
147     public ComponentBuilder<T, B> addOutput(final String outputName) {
148         final OutputDefinition outputDefinition = new OutputDefinition();
149         outputDefinition.setName(outputName);
150         outputDefinition.setUniqueId(outputName);
151         this.addOutput(outputDefinition);
152         return self();
153     }
154
155     public ComponentBuilder<T, B> addInstanceProperty(String instanceId, ComponentInstanceProperty prop) {
156         if (component.getComponentInstancesProperties() == null) {
157             component.setComponentInstancesProperties(new HashMap<>());
158         }
159         component.getComponentInstancesProperties().computeIfAbsent(instanceId, key -> new ArrayList<>()).add(prop);
160         return self();
161     }
162
163     public ComponentBuilder<T, B> addInstanceProperty(String instanceId, String propName) {
164         ComponentInstanceProperty componentInstanceProperty = new ComponentInstanceProperty();
165         componentInstanceProperty.setName(propName);
166         componentInstanceProperty.setUniqueId(propName);
167         this.addInstanceProperty(instanceId, componentInstanceProperty);
168         return self();
169     }
170
171     public ComponentBuilder<T, B> addInstanceInput(String instanceId, ComponentInstanceInput prop) {
172         if (component.getComponentInstancesInputs() == null) {
173             component.setComponentInstancesInputs(new HashMap<>());
174         }
175         component.getComponentInstancesInputs().computeIfAbsent(instanceId, key -> new ArrayList<>()).add(prop);
176         return self();
177     }
178
179     public ComponentBuilder<T, B> addInstanceInput(String instanceId, String propName) {
180         ComponentInstanceInput componentInstanceInput = new ComponentInstanceInput();
181         componentInstanceInput.setName(propName);
182         componentInstanceInput.setUniqueId(propName);
183         this.addInstanceInput(instanceId, componentInstanceInput);
184         return self();
185     }
186
187     public ComponentBuilder<T, B> addInstanceInput(String instanceId, String propName, List<GetInputValueDataDefinition> getInputValues) {
188         ComponentInstanceInput componentInstanceInput = new ComponentInstanceInput();
189         componentInstanceInput.setName(propName);
190         componentInstanceInput.setUniqueId(propName);
191         componentInstanceInput.setGetInputValues(getInputValues);
192         this.addInstanceInput(instanceId, componentInstanceInput);
193         return self();
194     }
195
196     public void addInstanceAttribute(String instanceId, ComponentInstanceAttribute attribute) {
197         Map<String, List<ComponentInstanceAttribute>> compInstAttribute = component.safeGetComponentInstancesAttributes();
198         if (compInstAttribute == null || compInstAttribute.isEmpty()) {
199             component.setComponentInstancesAttributes(new HashMap<>());
200         }
201         Map<String, List<ComponentInstanceAttribute>> instAttribute = component.safeGetComponentInstancesAttributes();
202         instAttribute.computeIfAbsent(instanceId, key -> new ArrayList<>()).add(attribute);
203         self();
204     }
205
206     public ComponentBuilder<T, B> addInstanceAttribute(String instanceId, String AttributeName) {
207         ComponentInstanceAttribute componentInstanceAttribute = new ComponentInstanceAttribute();
208         componentInstanceAttribute.setName(AttributeName);
209         componentInstanceAttribute.setUniqueId(AttributeName);
210         this.addInstanceAttribute(instanceId, componentInstanceAttribute);
211         return self();
212     }
213
214     public void addInstanceOutput(String instanceId, ComponentInstanceOutput attribute) {
215         if (component.getComponentInstancesOutputs() == null) {
216             component.setComponentInstancesOutputs(new HashMap<>());
217         }
218         component.getComponentInstancesOutputs().computeIfAbsent(instanceId, key -> new ArrayList<>()).add(attribute);
219         self();
220     }
221
222
223     public ComponentBuilder<T, B> addRelationship(RequirementCapabilityRelDef requirementCapabilityRelDef) {
224         if (component.getComponentInstancesRelations() == null) {
225             component.setComponentInstancesRelations(new ArrayList<>());
226         }
227         component.getComponentInstancesRelations().add(requirementCapabilityRelDef);
228         return self();
229     }
230
231     public ComponentBuilder<T, B> addPolicy(PolicyDefinition policyDefinition) {
232         if (component.getPolicies() == null) {
233             component.setPolicies(new HashMap<>());
234         }
235         component.getPolicies().put(policyDefinition.getUniqueId(), policyDefinition);
236         return self();
237     }
238
239     public ComponentBuilder<T, B> addPolicyProperty(String policyId, String propName){
240         PolicyDefinition policyWithProp = PolicyDefinitionBuilder.create()
241                 .addProperty(propName)
242                 .setUniqueId(policyId)
243                 .build();
244         return addPolicy(policyWithProp);
245     }
246
247     public ComponentBuilder<T, B> addGroup(GroupDefinition groupDefinition){
248         initGroups();
249         component.getGroups().add(groupDefinition);
250         return self();
251     }
252
253     public ComponentBuilder<T, B> addGroupProperty(String groupId, String propName){
254         GroupDefinition groupWithProp = GroupDefinitionBuilder.create()
255                 .addProperty(propName)
256                 .setUniqueId(groupId)
257                 .build();
258         return addGroup(groupWithProp);
259     }
260
261     private void initGroups() {
262         if(component.getGroups() == null){
263             component.setGroups(new ArrayList<>());
264         }
265     }
266
267     public ComponentBuilder<T, B> setPolicies(List<PolicyDefinition> policies) {
268         component.setPolicies(MapUtil.toMap(policies, PolicyDefinition::getUniqueId));
269         return self();
270     }
271
272     public ComponentBuilder<T, B> setGroups(List<GroupDefinition> groups) {
273         component.setGroups(groups);
274         return self();
275     }
276
277     public T build() {
278         return component;
279     }
280 }