Merge "Reorder modifiers"
[so.git] / bpmn / MSOCoreBPMN / src / main / java / org / openecomp / mso / bpmn / core / domain / ServiceDecomposition.java
1 /*-\r
2  * ============LICENSE_START=======================================================\r
3  * ONAP - SO\r
4  * ================================================================================\r
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.\r
6  * ================================================================================\r
7  * Licensed under the Apache License, Version 2.0 (the "License");\r
8  * you may not use this file except in compliance with the License.\r
9  * You may obtain a copy of the License at\r
10  *\r
11  *      http://www.apache.org/licenses/LICENSE-2.0\r
12  *\r
13  * Unless required by applicable law or agreed to in writing, software\r
14  * distributed under the License is distributed on an "AS IS" BASIS,\r
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16  * See the License for the specific language governing permissions and\r
17  * limitations under the License.\r
18  * ============LICENSE_END=========================================================\r
19  */\r
20 \r
21 package org.openecomp.mso.bpmn.core.domain;\r
22 \r
23 \r
24 import java.io.Serializable;\r
25 import java.util.ArrayList;\r
26 import java.util.Collections;\r
27 import java.util.Iterator;\r
28 import java.util.List;\r
29 \r
30 import com.fasterxml.jackson.annotation.JsonIgnore;\r
31 import com.fasterxml.jackson.annotation.JsonProperty;\r
32 import com.fasterxml.jackson.annotation.JsonRootName;\r
33 import org.json.JSONObject;\r
34 import org.openecomp.mso.bpmn.core.json.DecomposeJsonUtil;\r
35 import org.openecomp.mso.bpmn.core.json.JsonDecomposingException;\r
36 \r
37 \r
38 \r
39 \r
40 /**\r
41  * Service Decomposition Structure\r
42  * This Java object contains service information:\r
43  * - Service model info\r
44  * - Service type and role\r
45  * - list of VNF resource's decompositon\r
46  * - list of network resource's decompositon\r
47  * - list of allotted resource's decompositon\r
48  */\r
49 @JsonRootName(value = "serviceResources")\r
50 //@JsonTypeInfo(include=As.WRAPPER_OBJECT, use=Id.NAME)\r
51 public class ServiceDecomposition extends JsonWrapper implements Serializable {\r
52 \r
53         private static final long serialVersionUID = 1L;\r
54 \r
55         @JsonProperty("modelInfo")\r
56         private ModelInfo modelInfo;\r
57         @JsonProperty("serviceType")\r
58         private String serviceType;\r
59         @JsonProperty("serviceRole")\r
60         private String serviceRole;\r
61         private ServiceInstance serviceInstance;\r
62         private Request request;\r
63         private Customer customer;\r
64         private String callbackURN;\r
65         private String sdncVersion;\r
66         @JsonProperty("project")\r
67         private Project project;\r
68         @JsonProperty("owningEntity")\r
69         private OwningEntity owningEntity;\r
70         @JsonProperty("vnfResource")\r
71         private List <VnfResource>  vnfResources;\r
72         @JsonProperty("networkResource")\r
73         private List <NetworkResource>  networkResources;\r
74         @JsonProperty("allottedResource")\r
75         private List <AllottedResource>  allottedResources;\r
76         @JsonProperty("configResource")\r
77         private List <ConfigResource>  configResources;\r
78 \r
79         public ServiceDecomposition () {\r
80                 super();\r
81         }\r
82 \r
83         public ServiceDecomposition (String catalogRestOutput) throws JsonDecomposingException {\r
84                 ServiceDecomposition serviceDecomposition = DecomposeJsonUtil.jsonToServiceDecomposition(catalogRestOutput);\r
85                 this.modelInfo = serviceDecomposition.getModelInfo();\r
86                 this.vnfResources = serviceDecomposition.getServiceVnfs();\r
87                 this.allottedResources = serviceDecomposition.getServiceAllottedResources();\r
88                 this.networkResources = serviceDecomposition.getServiceNetworks();\r
89                 this.serviceRole = serviceDecomposition.getServiceRole();\r
90                 this.serviceType = serviceDecomposition.getServiceType();\r
91                 this.configResources = serviceDecomposition.getServiceConfigResources();\r
92         }\r
93 \r
94         /**\r
95          * Constructor taking Catalog DB Adapter REST output (serviceResources model) + service Instance ID\r
96          * @param catalogRestOutput\r
97          * @param serviceInstanceId\r
98          */\r
99         public ServiceDecomposition (String catalogRestOutput, String serviceInstanceId) throws JsonDecomposingException {\r
100                 ServiceDecomposition serviceDecomposition = DecomposeJsonUtil.jsonToServiceDecomposition(catalogRestOutput);\r
101                 this.modelInfo = serviceDecomposition.getModelInfo();\r
102                 this.vnfResources = serviceDecomposition.getServiceVnfs();\r
103                 this.allottedResources = serviceDecomposition.getServiceAllottedResources();\r
104                 this.configResources = serviceDecomposition.getServiceConfigResources();\r
105                 this.networkResources = serviceDecomposition.getServiceNetworks();\r
106 \r
107                 this.serviceRole = serviceDecomposition.getServiceRole();\r
108                 this.serviceType = serviceDecomposition.getServiceType();\r
109                 \r
110                 this.serviceInstance = new ServiceInstance();\r
111                 this.serviceInstance.setInstanceId(serviceInstanceId);\r
112                 \r
113                 this.project = serviceDecomposition.getProject();\r
114                 this.owningEntity = serviceDecomposition.getOwningEntity();\r
115         }\r
116 \r
117         /**\r
118          * Constructor taking a Service Decomposition JSON serialization\r
119          * @param catalogRestOutput\r
120          * @param serviceInstanceId\r
121          */\r
122         public ServiceDecomposition (JSONObject jsonServiceDecomposition, String serviceInstanceId) {\r
123                 //TODO provide constructor implementation\r
124 \r
125         }\r
126 \r
127         //*****\r
128         //GET and SET section\r
129         /**\r
130          * Return just the service model portion of the Service Decomposition as a Java object.\r
131          * The service model object should support retrieval as JSON string that is formatted correctly for sending serviceModelInfo to Building Blocks.\r
132          * @return\r
133          */\r
134         public ModelInfo getModelInfo() {\r
135                 return modelInfo;\r
136         }\r
137         public void setModelInfo(ModelInfo modelInfo) {\r
138                 this.modelInfo = modelInfo;\r
139         }\r
140         public ServiceInstance getServiceInstance() {\r
141                 return serviceInstance;\r
142         }\r
143         public void setServiceInstance(ServiceInstance serviceInstance) {\r
144                 this.serviceInstance = serviceInstance;\r
145         }\r
146         public Project getProject() {\r
147                 return project;\r
148         }\r
149         public OwningEntity getOwningEntity() {\r
150                 return owningEntity;\r
151         }\r
152         public void setProject(Project project) {\r
153                 this.project = project;\r
154         }\r
155         public void setOwningEntity(OwningEntity owningEntity) {\r
156                 this.owningEntity = owningEntity;\r
157         }\r
158         public List<VnfResource> getServiceVnfs() {\r
159                 return vnfResources;\r
160         }\r
161         public void setServiceVnfs(List<VnfResource> vnfResources) {\r
162                 this.vnfResources = vnfResources;\r
163         }\r
164         public List<NetworkResource> getServiceNetworks() {\r
165                 return networkResources;\r
166         }\r
167         public void setServiceConfigs(List<ConfigResource> configResources) {\r
168                 this.configResources = configResources;\r
169         }\r
170         public List<ConfigResource> getServiceConfigs() {\r
171                 return configResources;\r
172         }\r
173         public void setServiceNetworks(List<NetworkResource> networkResources) {\r
174                 this.networkResources = networkResources;\r
175         }\r
176         public List<AllottedResource> getServiceAllottedResources() {\r
177                 return allottedResources;\r
178         }\r
179         public void setServiceAllottedResources(List<AllottedResource> allottedResources) {\r
180                 this.allottedResources = allottedResources;\r
181         }\r
182         public List<ConfigResource> getServiceConfigResources() {\r
183                 return configResources;\r
184         }\r
185         public void setServiceConfigResources(List<ConfigResource> configResources) {\r
186                 this.configResources = configResources;\r
187         }\r
188         public String getServiceType() {\r
189                 return serviceType;\r
190         }\r
191 \r
192         public void setServiceType(String serviceType) {\r
193                 this.serviceType = serviceType;\r
194         }\r
195 \r
196         public String getServiceRole() {\r
197                 return serviceRole;\r
198         }\r
199 \r
200         public void setServiceRole(String serviceRole) {\r
201                 this.serviceRole = serviceRole;\r
202         }\r
203         public Request getRequest() {\r
204                 return request;\r
205         }\r
206 \r
207         public void setRequest(Request request) {\r
208                 this.request = request;\r
209         }\r
210         public Customer getCustomer() {\r
211                 return customer;\r
212         }\r
213         public void setCustomer(Customer customer) {\r
214                 this.customer = customer;\r
215         }\r
216         public String getCallbackURN() {\r
217                 return callbackURN;\r
218         }\r
219 \r
220         public void setCallbackURN(String callbackURN) {\r
221                 this.callbackURN = callbackURN;\r
222         }\r
223 \r
224         public String getSdncVersion() {\r
225                 return sdncVersion;\r
226         }\r
227 \r
228         public void setSdncVersion(String sdncVersion) {\r
229                 this.sdncVersion = sdncVersion;\r
230         }\r
231         \r
232         //*****\r
233 \r
234         //*****\r
235         //Access methods\r
236 \r
237 \r
238         /**\r
239          * This method returns one combined list of Resources of All Types\r
240          * @return\r
241          */\r
242         @JsonIgnore\r
243         public List<Resource> getServiceResources(){\r
244                 ArrayList serviceResources = new ArrayList();\r
245                 if(this.getServiceAllottedResources() != null){\r
246                         serviceResources.addAll(this.getServiceAllottedResources());\r
247                 }\r
248                 if(this.getServiceNetworks() != null){\r
249                         serviceResources.addAll(this.getServiceNetworks());\r
250                 }\r
251                 if(this.getServiceVnfs() != null){\r
252                         serviceResources.addAll(this.getServiceVnfs());\r
253                 }\r
254                 if(this.getServiceConfigResources() != null){\r
255                         serviceResources.addAll(this.getServiceConfigResources());\r
256                 }\r
257                 return serviceResources;\r
258         }\r
259 \r
260         /**\r
261          * This method returns String representation of one combined list of Resources of All Types\r
262          */\r
263         @JsonIgnore\r
264         public String getServiceResourcesJsonString() {\r
265                 return listToJson((this.getServiceNetworks())) +\r
266                         listToJson((this.getServiceVnfs())) +\r
267                         listToJson((this.getServiceAllottedResources())) +\r
268                         listToJson((this.getServiceConfigResources()));\r
269         }\r
270 \r
271         /**\r
272          * Returns a JSON list of all Network Resource structures (i.e. the serialized NetworkDecomposition objects).\r
273          * @return\r
274          */\r
275         @JsonIgnore\r
276         public String getServiceNetworksJson(){\r
277                 return listToJson(this.getServiceNetworks());\r
278         }\r
279         /**\r
280          * Returns a JSON list of all VnfResource structures (i.e. the serialized VnfResource objects).\r
281          * @return\r
282          */\r
283         @JsonIgnore\r
284         public String getServiceVnfsJson(){\r
285                 return listToJson(this.getServiceVnfs());\r
286         }\r
287         /**\r
288          * Returns a JSON list of all Allotted Resource structures (i.e. the serialized AllottedResource objects).\r
289          * @return\r
290          */\r
291         @JsonIgnore\r
292         public String getServiceAllottedResourcesJson(){\r
293                 return listToJson(this.getServiceAllottedResources());\r
294         }\r
295         /**\r
296          * Returns a JSON list of all Config Resource structures (i.e. the serialized ConfigResource objects).\r
297          * @return\r
298          */\r
299         @JsonIgnore\r
300         public String getServiceConfigResourcesJson(){\r
301                 return listToJson(this.getServiceConfigResources());\r
302         }\r
303 \r
304         //TODO - define Resource Object ID\r
305         @JsonIgnore\r
306         public String getVnfResource(String resourceObjectId) {\r
307 \r
308         for (Resource resource : getServiceResources()) {\r
309             //resource.getModelInfo().getModelInvariantId();\r
310 \r
311             if ("extracted information".equals(resourceObjectId)) {\r
312                 return resource.toJsonString();\r
313             }\r
314         }\r
315                 return "";\r
316         }\r
317 \r
318         //Methods to add Resource to the list\r
319         /**\r
320          * Add VNF resource to the list\r
321          * @param vnfResource\r
322          */\r
323         public void addVnfResource(Resource vnfResource) {\r
324                 if (vnfResources == null){\r
325                         vnfResources = new ArrayList<>();\r
326                 }\r
327                 this.vnfResources.add((VnfResource)vnfResource);\r
328         }\r
329         /**\r
330          * Add Network resource to the list\r
331          * @param networkResource\r
332          */\r
333         public void addNetworkResource(Resource networkResource) {\r
334                 if (networkResources == null){\r
335                         networkResources = new ArrayList<>();\r
336                 }\r
337                 this.networkResources.add((NetworkResource)networkResource);\r
338         }\r
339         /**\r
340          * Add Allotted resource to the list\r
341          * @param allottedResource\r
342          */\r
343         public void addAllottedResource(Resource allottedResource) {\r
344                 if (allottedResources == null){\r
345                         allottedResources = new ArrayList<>();\r
346                 }\r
347                 this.allottedResources.add((AllottedResource)allottedResource);\r
348         }\r
349         /**\r
350          * Add Config resource to the list\r
351          * @param allottedResource\r
352          */\r
353         public void addConfigResource(Resource configResource) {\r
354                 if (configResources == null){\r
355                         configResources = new ArrayList<>();\r
356                 }\r
357                 this.configResources.add((ConfigResource)configResource);\r
358         }\r
359         /**\r
360          * Add resource to the list\r
361          * Given a ResourceDecomposition (subclass) object, add it to the Service Decomposition (in the appropriate category, e.g. as a VNF, Network, or Allotted Resource).\r
362          * As dependencies are not currently supported, add it to the end of any ordered lists.\r
363          * @param resource\r
364          */\r
365         public void addResource(Resource resource) {\r
366                 //create resource based upon type\r
367                 switch (resource.resourceType) {\r
368                 case VNF:\r
369                         this.addVnfResource(resource);\r
370                         break;\r
371                 case NETWORK:\r
372                         this.addNetworkResource(resource);\r
373                      break;\r
374                 case ALLOTTED_RESOURCE:\r
375                         this.addAllottedResource(resource);\r
376                     break;\r
377                 case CONFIGURATION:\r
378                         this.addConfigResource(resource);\r
379                     break;\r
380                 default:\r
381                      throw new IllegalArgumentException("Invalid resource type: " + resource.resourceType);\r
382                  }\r
383         }\r
384 \r
385         /**\r
386          * Add resource to the list\r
387          * @param jsonResource\r
388          */\r
389         public void addVnfResource(String jsonResource) throws JsonDecomposingException {\r
390                 VnfResource vnfResource = null;\r
391                 vnfResource = DecomposeJsonUtil.jsonToVnfResource(jsonResource);\r
392                 this.addVnfResource(vnfResource);\r
393         }\r
394         /**\r
395          * Add resource to the list\r
396          * @param jsonResource\r
397          */\r
398         public void addNetworkResource(String jsonResource) throws JsonDecomposingException {\r
399                 NetworkResource networkResource = null;\r
400                 networkResource = DecomposeJsonUtil.jsonToNetworkResource(jsonResource);\r
401                 this.addVnfResource(networkResource);\r
402         }\r
403         /**\r
404          * Add resource to the list\r
405          * @param Resource\r
406          */\r
407         public void addAllottedResource(String jsonResource) throws JsonDecomposingException {\r
408                 AllottedResource allottedResource = null;\r
409                 allottedResource = DecomposeJsonUtil.jsonToAllottedResource(jsonResource);\r
410                 this.addVnfResource(allottedResource);\r
411         }\r
412         /**\r
413          * Add resource to the list\r
414          * @param Resource\r
415          */\r
416         public void addConfigResource(String jsonResource) throws JsonDecomposingException {\r
417                 ConfigResource configResource = null;\r
418                 configResource = DecomposeJsonUtil.jsonToConfigResource(jsonResource);\r
419                 this.addVnfResource(configResource);\r
420         }\r
421         /**\r
422          * Given a ResourceDecomposition (subclass) object, locate it in the Service Decomposition by its unique ID, and replace the current version with the new one.\r
423          * This method should support concurrency control via an auto-incrementing field in the ResourceDecomposition class.\r
424          * @param newResource\r
425          * @return TRUE if replacement was a success\r
426          */\r
427         public boolean replaceResource(Resource newResource){\r
428                 boolean result = false;\r
429                 List serviceResources = getServiceResources();\r
430                 for (Resource resource : (Iterable<Resource>) serviceResources) {\r
431                         System.out.println("resource found");\r
432                         if (resource.resourceType == newResource.resourceType) {\r
433                                 System.out.println("resource type matches");\r
434                                 if (resource.getResourceId().equalsIgnoreCase(newResource.getResourceId())) {\r
435                                         System.out.println("resource id matches");\r
436                                         //returns TRUE if replacement is a success\r
437                                         result = Collections.replaceAll(serviceResources, resource, newResource);\r
438                                 }\r
439                         }\r
440                 }\r
441                 //set updated list into ServiceDecomposition\r
442                 this.setResourceList(serviceResources);\r
443                 return result;\r
444         }\r
445 \r
446         /**\r
447          * Given a ResourceDecomposition as a JSON string, locate it in the Service Decomposition by its unique ID,\r
448          *  and replace the current version with the new one.\r
449          * @param jsonString\r
450          * @return\r
451          */\r
452         public boolean replaceResource(String jsonString){\r
453                 //TODO: define unique ID for the Resource!\r
454                 return false;\r
455         }\r
456 \r
457         /**\r
458          *  Given a resource object ID, locate it in the Service Decomposition by its unique ID, and delete it.\r
459          * @param resource\r
460          * @return TRUE if delete was a success\r
461          */\r
462         public boolean deleteResource(Resource resource){\r
463                 List serviceResources = getServiceResources();\r
464                 for (Resource item : (Iterable<Resource>) serviceResources) {\r
465                         if (item.resourceType == resource.resourceType) {\r
466                                 if (item.getResourceId().equalsIgnoreCase(resource.getResourceId())) {\r
467                                         //returns TRUE if replacement is a success\r
468                                         return serviceResources.remove(resource);\r
469                                 }\r
470                         }\r
471                 }\r
472 \r
473                 return false;\r
474         }\r
475 \r
476         /**\r
477          * Generic method to set List of ResourceDecomposition objects\r
478          * @param resources\r
479          * @return\r
480          */\r
481         public boolean setResourceList(List<Resource> resources){\r
482                 //create resource based upon type\r
483                 switch (resources.get(0).resourceType) {\r
484                 case VNF:\r
485                         this.setServiceVnfs((List<VnfResource>)(List<?>)resources);\r
486                         break;\r
487                 case NETWORK:\r
488                         this.setServiceNetworks((List<NetworkResource>)(List<?>)resources);\r
489                     break;\r
490                 case ALLOTTED_RESOURCE:\r
491                         this.setServiceAllottedResources((List<AllottedResource>)(List<?>)resources);\r
492                     break;\r
493                 case CONFIGURATION:\r
494                         this.setServiceConfigResources((List<ConfigResource>)(List<?>)resources);\r
495                     break;\r
496                 default:\r
497                      throw new IllegalArgumentException("Invalid resource type: " + resources.get(0).resourceType);\r
498                  }\r
499 \r
500                 return false;\r
501         }\r
502 \r
503         /**\r
504          *\r
505          * This method locates and returns a resource in a given\r
506          * Service Decomposition object by its unique resource id.\r
507          * Returns null if resource doesn't exist.\r
508          *\r
509          * @param resourceId - id of the resource\r
510          * @return resource\r
511          */\r
512         @JsonIgnore\r
513         public Resource getServiceResource(String resourceId){\r
514                 List<Resource> resources = getServiceResources();\r
515                 for (Resource resource : resources) {\r
516                         if (resource.getResourceId().equalsIgnoreCase(resourceId)) {\r
517                                 //match\r
518                                 return resource;\r
519                         }\r
520                 }\r
521                 return null;\r
522         }\r
523 \r
524 }\r