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