2 * ============LICENSE_START=======================================================
\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
11 * http://www.apache.org/licenses/LICENSE-2.0
\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
21 package org.openecomp.mso.bpmn.core.domain;
\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
30 import com.fasterxml.jackson.annotation.JsonIgnore;
\r
31 import com.fasterxml.jackson.annotation.JsonProperty;
\r
32 import com.fasterxml.jackson.annotation.JsonRootName;
\r
34 import org.json.JSONObject;
\r
35 import org.openecomp.mso.bpmn.core.json.DecomposeJsonUtil;
\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
48 @JsonRootName(value = "serviceResources")
\r
49 //@JsonTypeInfo(include=As.WRAPPER_OBJECT, use=Id.NAME)
\r
50 public class ServiceDecomposition extends JsonWrapper implements Serializable {
\r
52 private static final long serialVersionUID = 1L;
\r
53 DecomposeJsonUtil jsonUtils = new DecomposeJsonUtil();
\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
69 public ServiceDecomposition () {
\r
73 public ServiceDecomposition (String catalogRestOutput) {
\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
85 * Constructor taking Catalog DB Adapter REST output (serviceResources model) + service Instance ID
\r
86 * @param catalogRestOutput
\r
87 * @param serviceInstanceId
\r
89 public ServiceDecomposition (String catalogRestOutput, String serviceInstanceId) {
\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
97 this.serviceRole = serviceDecomposition.getServiceRole();
\r
98 this.serviceType = serviceDecomposition.getServiceType();
\r
100 this.serviceInstance = new ServiceInstance();
\r
101 this.serviceInstance.setInstanceId(serviceInstanceId);
\r
105 * Constructor taking a Service Decomposition JSON serialization
\r
106 * @param catalogRestOutput
\r
107 * @param serviceInstanceId
\r
109 public ServiceDecomposition (JSONObject jsonServiceDecomposition, String serviceInstanceId) {
\r
110 //TODO provide constructor implementation
\r
115 //GET and SET section
\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
121 public ModelInfo getModelInfo() {
\r
124 public void setModelInfo(ModelInfo modelInfo) {
\r
125 this.modelInfo = modelInfo;
\r
127 public ServiceInstance getServiceInstance() {
\r
128 return serviceInstance;
\r
130 public void setServiceInstance(ServiceInstance serviceInstance) {
\r
131 this.serviceInstance = serviceInstance;
\r
133 public List<VnfResource> getServiceVnfs() {
\r
134 return vnfResources;
\r
136 public void setServiceVnfs(List<VnfResource> vnfResources) {
\r
137 this.vnfResources = vnfResources;
\r
139 public List<NetworkResource> getServiceNetworks() {
\r
140 return networkResources;
\r
142 public void setServiceNetworks(List<NetworkResource> networkResources) {
\r
143 this.networkResources = networkResources;
\r
145 public List<AllottedResource> getServiceAllottedResources() {
\r
146 return allottedResources;
\r
148 public void setServiceAllottedResources(List<AllottedResource> allottedResources) {
\r
149 this.allottedResources = allottedResources;
\r
151 public String getServiceType() {
\r
152 return serviceType;
\r
155 public void setServiceType(String serviceType) {
\r
156 this.serviceType = serviceType;
\r
159 public String getServiceRole() {
\r
160 return serviceRole;
\r
163 public void setServiceRole(String serviceRole) {
\r
164 this.serviceRole = serviceRole;
\r
173 * This method returns one combined list of Resources of All Types
\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
182 if(this.getServiceNetworks() != null){
\r
183 serviceResources.addAll(this.getServiceNetworks());
\r
185 if(this.getServiceVnfs() != null){
\r
186 serviceResources.addAll(this.getServiceVnfs());
\r
188 return serviceResources;
\r
192 * This method returns String representation of one combined list of Resources of All Types
\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
205 * Returns a JSON list of all Network Resource structures (i.e. the serialized NetworkDecomposition objects).
\r
209 public String getServiceNetworksJson(){
\r
210 return listToJson(this.getServiceNetworks());
\r
213 * Returns a JSON list of all VnfResource structures (i.e. the serialized VnfResource objects).
\r
217 public String getServiceVnfsJson(){
\r
218 return listToJson(this.getServiceVnfs());
\r
221 * Returns a JSON list of all Allotted Resource structures (i.e. the serialized AllottedResource objects).
\r
225 public String getServiceAllottedResourcesJson(){
\r
226 return listToJson(this.getServiceAllottedResources());
\r
229 //TODO - define Resource Object ID
\r
231 public String getVnfResource(String resourceObjectId) {
\r
233 Iterator<Resource> iter = getServiceResources().iterator();
\r
234 while (iter.hasNext()) {
\r
235 Resource resource = iter.next();
\r
236 //resource.getModelInfo().getModelInvariantId();
\r
238 if ("extracted information".equals(resourceObjectId)){
\r
239 return resource.toJsonString();
\r
245 //Methods to add Resource to the list
\r
247 * Add VNF resource to the list
\r
248 * @param vnfResource
\r
250 public void addVnfResource(Resource vnfResource) {
\r
251 if (vnfResources == null){
\r
252 vnfResources = new ArrayList<VnfResource>();
\r
254 this.vnfResources.add((VnfResource)vnfResource);
\r
257 * Add Network resource to the list
\r
258 * @param networkResource
\r
260 public void addNetworkResource(Resource networkResource) {
\r
261 if (networkResources == null){
\r
262 networkResources = new ArrayList<NetworkResource>();
\r
264 this.networkResources.add((NetworkResource)networkResource);
\r
267 * Add Allotted resource to the list
\r
268 * @param allottedResource
\r
270 public void addAllottedResource(Resource allottedResource) {
\r
271 if (allottedResources == null){
\r
272 allottedResources = new ArrayList<AllottedResource>();
\r
274 this.allottedResources.add((AllottedResource)allottedResource);
\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
283 public void addResource(Resource resource) {
\r
284 //create resource based upon type
\r
285 switch (resource.resourceType) {
\r
287 this.addVnfResource(resource);
\r
290 this.addNetworkResource(resource);
\r
292 case ALLOTTED_RESOURCE:
\r
293 this.addAllottedResource(resource);
\r
296 throw new IllegalArgumentException("Invalid resource type: " + resource.resourceType);
\r
301 * Add resource to the list
\r
304 public void addVnfResource(String jsonResource) {
\r
305 VnfResource vnfResource = null;
\r
306 vnfResource = DecomposeJsonUtil.JsonToVnfResource(jsonResource);
\r
307 this.addVnfResource(vnfResource);
\r
310 * Add resource to the list
\r
313 public void addNetworkResource(String jsonResource) {
\r
314 NetworkResource networkResource = null;
\r
315 networkResource = DecomposeJsonUtil.JsonToNetworkResource(jsonResource);
\r
316 this.addVnfResource(networkResource);
\r
319 * Add resource to the list
\r
322 public void addAllottedResource(String jsonResource) {
\r
323 AllottedResource allottedResource = null;
\r
324 allottedResource = DecomposeJsonUtil.JsonToAllottedResource(jsonResource);
\r
325 this.addVnfResource(allottedResource);
\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
332 * @return TRUE if replacement was a success
\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
350 //set updated list into ServiceDecomposition
\r
351 this.setResourceList(serviceResources);
\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
361 public boolean replaceResource(String jsonString){
\r
362 //TODO: define unique ID for the Resource!
\r
367 * Given a resource object ID, locate it in the Service Decomposition by its unique ID, and delete it.
\r
369 * @return TRUE if delete was a success
\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
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
389 * Generic method to set List of ResourceDecomposition objects
\r
393 public boolean setResourceList(List<Resource> resources){
\r
394 //create resource based upon type
\r
395 switch (resources.get(0).resourceType) {
\r
397 this.setServiceVnfs((List<VnfResource>)(List<?>)resources);
\r
400 this.setServiceNetworks((List<NetworkResource>)(List<?>)resources);
\r
402 case ALLOTTED_RESOURCE:
\r
403 this.setServiceAllottedResources((List<AllottedResource>)(List<?>)resources);
\r
406 throw new IllegalArgumentException("Invalid resource type: " + resources.get(0).resourceType);
\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
418 * @param resourceId - id of the resource
\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