Merge "Added FunctionalInterface annotation"
[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 \r
34 import org.json.JSONObject;\r
35 import org.openecomp.mso.bpmn.core.json.DecomposeJsonUtil;\r
36 \r
37 \r
38 \r
39 /**\r
40  * Service Decomposition Structure\r
41  * This Java object contains service information:\r
42  * - Service model info\r
43  * - Service type and role\r
44  * - list of VNF resource's decompositon\r
45  * - list of network resource's decompositon\r
46  * - list of allotted resource's decompositon\r
47  */\r
48 @JsonRootName(value = "serviceResources")\r
49 //@JsonTypeInfo(include=As.WRAPPER_OBJECT, use=Id.NAME)\r
50 public class ServiceDecomposition extends JsonWrapper implements Serializable {\r
51 \r
52         private static final long serialVersionUID = 1L;\r
53         DecomposeJsonUtil jsonUtils = new DecomposeJsonUtil();\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         @JsonProperty("vnfResource")\r
63         private List <VnfResource>  vnfResources;\r
64         @JsonProperty("networkResource")\r
65         private List <NetworkResource>  networkResources;\r
66         @JsonProperty("allottedResource")\r
67         private List <AllottedResource>  allottedResources;\r
68 \r
69         public ServiceDecomposition () {\r
70                 super();\r
71         }\r
72 \r
73         public ServiceDecomposition (String catalogRestOutput) {\r
74 \r
75                 ServiceDecomposition serviceDecomposition = DecomposeJsonUtil.JsonToServiceDecomposition(catalogRestOutput);\r
76                 this.modelInfo = serviceDecomposition.getModelInfo();\r
77                 this.vnfResources = serviceDecomposition.getServiceVnfs();\r
78                 this.allottedResources = serviceDecomposition.getServiceAllottedResources();\r
79                 this.networkResources = serviceDecomposition.getServiceNetworks();\r
80                 this.serviceRole = serviceDecomposition.getServiceRole();\r
81                 this.serviceType = serviceDecomposition.getServiceType();\r
82         }\r
83 \r
84         /**\r
85          * Constructor taking Catalog DB Adapter REST output (serviceResources model) + service Instance ID\r
86          * @param catalogRestOutput\r
87          * @param serviceInstanceId\r
88          */\r
89         public ServiceDecomposition (String catalogRestOutput, String serviceInstanceId) {\r
90 \r
91                 ServiceDecomposition serviceDecomposition = DecomposeJsonUtil.JsonToServiceDecomposition(catalogRestOutput);\r
92                 this.modelInfo = serviceDecomposition.getModelInfo();\r
93                 this.vnfResources = serviceDecomposition.getServiceVnfs();\r
94                 this.allottedResources = serviceDecomposition.getServiceAllottedResources();\r
95                 this.networkResources = serviceDecomposition.getServiceNetworks();\r
96 \r
97                 this.serviceRole = serviceDecomposition.getServiceRole();\r
98                 this.serviceType = serviceDecomposition.getServiceType();\r
99                 \r
100                 this.serviceInstance = new ServiceInstance();\r
101                 this.serviceInstance.setInstanceId(serviceInstanceId);\r
102         }\r
103 \r
104         /**\r
105          * Constructor taking a Service Decomposition JSON serialization\r
106          * @param catalogRestOutput\r
107          * @param serviceInstanceId\r
108          */\r
109         public ServiceDecomposition (JSONObject jsonServiceDecomposition, String serviceInstanceId) {\r
110                 //TODO provide constructor implementation\r
111 \r
112         }\r
113 \r
114         //*****\r
115         //GET and SET section\r
116         /**\r
117          * Return just the service model portion of the Service Decomposition as a Java object.\r
118          * The service model object should support retrieval as JSON string that is formatted correctly for sending serviceModelInfo to Building Blocks.\r
119          * @return\r
120          */\r
121         public ModelInfo getModelInfo() {\r
122                 return modelInfo;\r
123         }\r
124         public void setModelInfo(ModelInfo modelInfo) {\r
125                 this.modelInfo = modelInfo;\r
126         }\r
127         public ServiceInstance getServiceInstance() {\r
128                 return serviceInstance;\r
129         }\r
130         public void setServiceInstance(ServiceInstance serviceInstance) {\r
131                 this.serviceInstance = serviceInstance;\r
132         }\r
133         public List<VnfResource> getServiceVnfs() {\r
134                 return vnfResources;\r
135         }\r
136         public void setServiceVnfs(List<VnfResource> vnfResources) {\r
137                 this.vnfResources = vnfResources;\r
138         }\r
139         public List<NetworkResource> getServiceNetworks() {\r
140                 return networkResources;\r
141         }\r
142         public void setServiceNetworks(List<NetworkResource> networkResources) {\r
143                 this.networkResources = networkResources;\r
144         }\r
145         public List<AllottedResource> getServiceAllottedResources() {\r
146                 return allottedResources;\r
147         }\r
148         public void setServiceAllottedResources(List<AllottedResource> allottedResources) {\r
149                 this.allottedResources = allottedResources;\r
150         }\r
151         public String getServiceType() {\r
152                 return serviceType;\r
153         }\r
154 \r
155         public void setServiceType(String serviceType) {\r
156                 this.serviceType = serviceType;\r
157         }\r
158 \r
159         public String getServiceRole() {\r
160                 return serviceRole;\r
161         }\r
162 \r
163         public void setServiceRole(String serviceRole) {\r
164                 this.serviceRole = serviceRole;\r
165         }\r
166         //*****\r
167 \r
168         //*****\r
169         //Access methods\r
170 \r
171 \r
172         /**\r
173          * This method returns one combined list of Resources of All Types\r
174          * @return\r
175          */\r
176         @JsonIgnore\r
177         public List<Resource> getServiceResources(){\r
178                 ArrayList serviceResources = new ArrayList();\r
179                 if(this.getServiceAllottedResources() != null){\r
180                         serviceResources.addAll(this.getServiceAllottedResources());\r
181                 }\r
182                 if(this.getServiceNetworks() != null){\r
183                         serviceResources.addAll(this.getServiceNetworks());\r
184                 }\r
185                 if(this.getServiceVnfs() != null){\r
186                         serviceResources.addAll(this.getServiceVnfs());\r
187                 }\r
188                 return serviceResources;\r
189         }\r
190 \r
191         /**\r
192          * This method returns String representation of one combined list of Resources of All Types\r
193          * @return\r
194          */\r
195         @JsonIgnore\r
196         public String getServiceResourcesJsonString(){\r
197                 StringBuffer serviceResourcesJsonStringBuffer = new StringBuffer();\r
198                 serviceResourcesJsonStringBuffer.append(listToJson((this.getServiceNetworks())));\r
199                 serviceResourcesJsonStringBuffer.append(listToJson((this.getServiceVnfs())));\r
200                 serviceResourcesJsonStringBuffer.append(listToJson((this.getServiceAllottedResources())));\r
201                 return serviceResourcesJsonStringBuffer.toString();\r
202         }\r
203 \r
204         /**\r
205          * Returns a JSON list of all Network Resource structures (i.e. the serialized NetworkDecomposition objects).\r
206          * @return\r
207          */\r
208         @JsonIgnore\r
209         public String getServiceNetworksJson(){\r
210                 return listToJson(this.getServiceNetworks());\r
211         }\r
212         /**\r
213          * Returns a JSON list of all VnfResource structures (i.e. the serialized VnfResource objects).\r
214          * @return\r
215          */\r
216         @JsonIgnore\r
217         public String getServiceVnfsJson(){\r
218                 return listToJson(this.getServiceVnfs());\r
219         }\r
220         /**\r
221          * Returns a JSON list of all Allotted Resource structures (i.e. the serialized AllottedResource objects).\r
222          * @return\r
223          */\r
224         @JsonIgnore\r
225         public String getServiceAllottedResourcesJson(){\r
226                 return listToJson(this.getServiceAllottedResources());\r
227         }\r
228 \r
229         //TODO - define Resource Object ID\r
230         @JsonIgnore\r
231         public String getVnfResource(String resourceObjectId) {\r
232 \r
233                 Iterator<Resource> iter = getServiceResources().iterator();\r
234                 while (iter.hasNext()) {\r
235                         Resource resource = iter.next();\r
236                         //resource.getModelInfo().getModelInvariantId();\r
237 \r
238                         if ("extracted information".equals(resourceObjectId)){\r
239                                 return resource.toJsonString();\r
240                         }\r
241                 }\r
242                 return "";\r
243         }\r
244 \r
245         //Methods to add Resource to the list\r
246         /**\r
247          * Add VNF resource to the list\r
248          * @param vnfResource\r
249          */\r
250         public void addVnfResource(Resource vnfResource) {\r
251                 if (vnfResources == null){\r
252                         vnfResources = new ArrayList<VnfResource>();\r
253                 }\r
254                 this.vnfResources.add((VnfResource)vnfResource);\r
255         }\r
256         /**\r
257          * Add Network resource to the list\r
258          * @param networkResource\r
259          */\r
260         public void addNetworkResource(Resource networkResource) {\r
261                 if (networkResources == null){\r
262                         networkResources = new ArrayList<NetworkResource>();\r
263                 }\r
264                 this.networkResources.add((NetworkResource)networkResource);\r
265         }\r
266         /**\r
267          * Add Allotted resource to the list\r
268          * @param allottedResource\r
269          */\r
270         public void addAllottedResource(Resource allottedResource) {\r
271                 if (allottedResources == null){\r
272                         allottedResources = new ArrayList<AllottedResource>();\r
273                 }\r
274                 this.allottedResources.add((AllottedResource)allottedResource);\r
275         }\r
276 \r
277         /**\r
278          * Add resource to the list\r
279          * 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
280          * As dependencies are not currently supported, add it to the end of any ordered lists.\r
281          * @param Resource\r
282          */\r
283         public void addResource(Resource resource) {\r
284                 //create resource based upon type\r
285                 switch (resource.resourceType) {\r
286                 case VNF:\r
287                         this.addVnfResource(resource);\r
288                         break;\r
289                 case NETWORK:\r
290                         this.addNetworkResource(resource);\r
291                      break;\r
292                 case ALLOTTED_RESOURCE:\r
293                         this.addAllottedResource(resource);\r
294                     break;\r
295                 default:\r
296                      throw new IllegalArgumentException("Invalid resource type: " + resource.resourceType);\r
297                  }\r
298         }\r
299 \r
300         /**\r
301          * Add resource to the list\r
302          * @param Resource\r
303          */\r
304         public void addVnfResource(String jsonResource) {\r
305                 VnfResource vnfResource = null;\r
306                 vnfResource = DecomposeJsonUtil.JsonToVnfResource(jsonResource);\r
307                 this.addVnfResource(vnfResource);\r
308         }\r
309         /**\r
310          * Add resource to the list\r
311          * @param Resource\r
312          */\r
313         public void addNetworkResource(String jsonResource) {\r
314                 NetworkResource networkResource = null;\r
315                 networkResource = DecomposeJsonUtil.JsonToNetworkResource(jsonResource);\r
316                 this.addVnfResource(networkResource);\r
317         }\r
318         /**\r
319          * Add resource to the list\r
320          * @param Resource\r
321          */\r
322         public void addAllottedResource(String jsonResource) {\r
323                 AllottedResource allottedResource = null;\r
324                 allottedResource = DecomposeJsonUtil.JsonToAllottedResource(jsonResource);\r
325                 this.addVnfResource(allottedResource);\r
326         }\r
327 \r
328         /**\r
329          * 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
330          * This method should support concurrency control via an auto-incrementing field in the ResourceDecomposition class.\r
331          * @param Resource\r
332          * @return TRUE if replacement was a success\r
333          */\r
334         public boolean replaceResource(Resource newResource){\r
335                 boolean result = false;\r
336                 List serviceResources = getServiceResources();\r
337                 Iterator<Resource> iter = serviceResources.iterator();\r
338                 while (iter.hasNext()) {\r
339                         Resource resource = iter.next();\r
340                         System.out.println("resource found");\r
341                         if (resource.resourceType == newResource.resourceType){\r
342                                 System.out.println("resource type matches");\r
343                                 if (resource.getResourceId().equalsIgnoreCase(newResource.getResourceId())){\r
344                                         System.out.println("resource id matches");\r
345                                         //returns TRUE if replacement is a success\r
346                                         result = Collections.replaceAll(serviceResources, resource, newResource);\r
347                                 }\r
348                         }\r
349                 }\r
350                 //set updated list into ServiceDecomposition\r
351                 this.setResourceList(serviceResources);\r
352                 return result;\r
353         }\r
354 \r
355         /**\r
356          * Given a ResourceDecomposition as a JSON string, locate it in the Service Decomposition by its unique ID,\r
357          *  and replace the current version with the new one.\r
358          * @param jsonString\r
359          * @return\r
360          */\r
361         public boolean replaceResource(String jsonString){\r
362                 //TODO: define unique ID for the Resource!\r
363                 return false;\r
364         }\r
365 \r
366         /**\r
367          *  Given a resource object ID, locate it in the Service Decomposition by its unique ID, and delete it.\r
368          * @param Resource\r
369          * @return TRUE if delete was a success\r
370          */\r
371         public boolean deleteResource(Resource resource){\r
372                 List serviceResources = getServiceResources();\r
373                 Iterator<Resource> iter = serviceResources.iterator();\r
374                 while (iter.hasNext()) {\r
375                         Resource item = iter.next();\r
376 \r
377                         if (item.resourceType == resource.resourceType){\r
378                                 if (item.getResourceId().equalsIgnoreCase(resource.getResourceId())){\r
379                                         //returns TRUE if replacement is a success\r
380                                         return serviceResources.remove(resource);\r
381                                 }\r
382                         }\r
383                 }\r
384 \r
385                 return false;\r
386         }\r
387 \r
388         /**\r
389          * Generic method to set List of ResourceDecomposition objects\r
390          * @param resources\r
391          * @return\r
392          */\r
393         public boolean setResourceList(List<Resource> resources){\r
394                 //create resource based upon type\r
395                 switch (resources.get(0).resourceType) {\r
396                 case VNF:\r
397                         this.setServiceVnfs((List<VnfResource>)(List<?>)resources);\r
398                         break;\r
399                 case NETWORK:\r
400                         this.setServiceNetworks((List<NetworkResource>)(List<?>)resources);\r
401                     break;\r
402                 case ALLOTTED_RESOURCE:\r
403                         this.setServiceAllottedResources((List<AllottedResource>)(List<?>)resources);\r
404                     break;\r
405                 default:\r
406                      throw new IllegalArgumentException("Invalid resource type: " + resources.get(0).resourceType);\r
407                  }\r
408 \r
409                 return false;\r
410         }\r
411 \r
412         /**\r
413          *\r
414          * This method locates and returns a resource in a given\r
415          * Service Decomposition object by its unique resource id.\r
416          * Returns null if resource doesn't exist.\r
417          *\r
418          * @param resourceId - id of the resource\r
419          * @return resource\r
420          */\r
421         @JsonIgnore\r
422         public Resource getServiceResource(String resourceId){\r
423                 List<Resource> resources = getServiceResources();\r
424                 Iterator<Resource> iter = resources.iterator();\r
425                 while (iter.hasNext()){\r
426                         Resource resource = iter.next();\r
427                         if (resource.getResourceId().equalsIgnoreCase(resourceId)){\r
428                                 //match\r
429                                 return resource;\r
430                         }\r
431                 }\r
432                 return null;\r
433         }\r
434 }\r