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