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