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