Merge "Enhanced List Level flow with backward support"
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / onap / so / apihandlerinfra / infra / rest / BpmnRequestBuilder.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 - 2019 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.apihandlerinfra.infra.rest;
22
23 import java.util.HashMap;
24 import java.util.List;
25 import java.util.Map;
26 import java.util.Optional;
27 import org.onap.aai.domain.yang.GenericVnf;
28 import org.onap.aai.domain.yang.L3Network;
29 import org.onap.aai.domain.yang.ServiceInstance;
30 import org.onap.aai.domain.yang.VfModule;
31 import org.onap.aai.domain.yang.VolumeGroup;
32 import org.onap.logging.ref.slf4j.ONAPLogConstants;
33 import org.onap.so.apihandlerinfra.infra.rest.exception.AAIEntityNotFound;
34 import org.onap.so.apihandlerinfra.infra.rest.exception.CloudConfigurationNotFoundException;
35 import org.onap.so.client.aai.AAIObjectType;
36 import org.onap.so.client.aai.AAIResourcesClient;
37 import org.onap.so.client.aai.entities.AAIResultWrapper;
38 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
39 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
40 import org.onap.so.constants.Status;
41 import org.onap.so.db.request.beans.InfraActiveRequests;
42 import org.onap.so.db.request.client.RequestsDbClient;
43 import org.onap.so.serviceinstancebeans.CloudConfiguration;
44 import org.onap.so.serviceinstancebeans.ModelInfo;
45 import org.onap.so.serviceinstancebeans.ModelType;
46 import org.onap.so.serviceinstancebeans.RequestDetails;
47 import org.onap.so.serviceinstancebeans.RequestInfo;
48 import org.onap.so.serviceinstancebeans.RequestParameters;
49 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
50 import org.slf4j.Logger;
51 import org.slf4j.LoggerFactory;
52 import org.slf4j.MDC;
53 import org.springframework.beans.factory.annotation.Autowired;
54 import org.springframework.stereotype.Component;
55 import com.fasterxml.jackson.databind.ObjectMapper;
56
57 @Component
58 public class BpmnRequestBuilder {
59
60     private static final String CLOUD_CONFIGURATION_COULD_NOT_BE_FOUND = "Cloud Configuration could not be found";
61
62     private static final String CLOUD_REGION_ID = "cloud-region-id";
63
64     private static final String CLOUD_OWNER = "cloud-owner";
65
66     private static final String TENANT_ID = "tenant-id";
67
68     private static final String GENERIC_VNF_NOT_FOUND_IN_INVENTORY_VNF_ID =
69             "Generic Vnf Not Found In Inventory, VnfId: ";
70
71     private static final String VF_MODULE_NOT_FOUND_IN_INVENTORY_VNF_ID = "VF Module Not Found In Inventory, VnfId: ";
72
73     private static final Logger logger = LoggerFactory.getLogger(BpmnRequestBuilder.class);
74
75     @Autowired
76     private RequestsDbClient infraActiveRequestsClient;
77
78     private ObjectMapper mapper = new ObjectMapper();
79
80     private AAIResourcesClient aaiResourcesClient;
81
82     public ServiceInstancesRequest buildVFModuleDeleteRequest(String vnfId, String vfModuleId, ModelType modelType)
83             throws AAIEntityNotFound {
84         GenericVnf vnf = getGenericVnf(vnfId);
85         if (vnf == null) {
86             throw new AAIEntityNotFound(GENERIC_VNF_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId);
87         }
88         VfModule vfModule = getAAIVfModule(vnfId, vfModuleId);
89         if (vfModule == null) {
90             throw new AAIEntityNotFound(VF_MODULE_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId + " vfModuleId: " + vfModuleId);
91         }
92         return createServiceInstancesRequest(vnf, vfModule, modelType);
93     }
94
95     public ServiceInstancesRequest buildVolumeGroupDeleteRequest(String vnfId, String volumeGroupId)
96             throws AAIEntityNotFound {
97         GenericVnf vnf = getGenericVnf(vnfId);
98         if (vnf == null) {
99             throw new AAIEntityNotFound(GENERIC_VNF_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId);
100         }
101         VolumeGroup volumeGroup = getVolumeGroup(vnfId, volumeGroupId);
102         if (volumeGroup == null) {
103             throw new AAIEntityNotFound(
104                     VF_MODULE_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId + " volumeGroupId: " + volumeGroupId);
105         }
106         return createServiceInstancesRequest(vnf, volumeGroup);
107     }
108
109     public ServiceInstancesRequest buildServiceDeleteRequest(String serviceInstanceId) throws AAIEntityNotFound {
110         ServiceInstance serviceInstance = getServiceInstance(serviceInstanceId);
111         if (serviceInstance == null) {
112             throw new AAIEntityNotFound(
113                     "ServiceInstance Not Found In Inventory, ServiceInstanceId: " + serviceInstanceId);
114         }
115         return createServiceInstancesRequest(serviceInstance);
116     }
117
118     public ServiceInstancesRequest buildVnfDeleteRequest(String vnfId) throws AAIEntityNotFound {
119         GenericVnf vnf = getGenericVnf(vnfId);
120         if (vnf == null) {
121             throw new AAIEntityNotFound(GENERIC_VNF_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId);
122         }
123         return createServiceInstancesRequest(vnf);
124     }
125
126     public ServiceInstancesRequest buildNetworkDeleteRequest(String networkId) throws AAIEntityNotFound {
127         L3Network network = getNetwork(networkId);
128         if (network == null) {
129             throw new AAIEntityNotFound("Network Not Found In Inventory, NetworkId: " + networkId);
130         }
131         return createServiceInstancesRequest(network);
132     }
133
134     protected ServiceInstancesRequest createServiceInstancesRequest(ServiceInstance serviceInstance) {
135         ServiceInstancesRequest request = new ServiceInstancesRequest();
136         RequestDetails requestDetails = mapServiceRequestDetails(serviceInstance);
137         request.setRequestDetails(requestDetails);
138         return request;
139     }
140
141     protected ServiceInstancesRequest createServiceInstancesRequest(GenericVnf vnf) {
142         ServiceInstancesRequest request = new ServiceInstancesRequest();
143         RequestDetails requestDetails = mapVnfRequestDetails(vnf);
144         request.setRequestDetails(requestDetails);
145         return request;
146     }
147
148     protected ServiceInstancesRequest createServiceInstancesRequest(GenericVnf vnf, VfModule vfModule,
149             ModelType modelType) {
150         ServiceInstancesRequest request = new ServiceInstancesRequest();
151         RequestDetails requestDetails = mapRequestDetails(vnf, vfModule, modelType);
152         request.setRequestDetails(requestDetails);
153         return request;
154     }
155
156     protected ServiceInstancesRequest createServiceInstancesRequest(GenericVnf vnf, VolumeGroup volumeGroup) {
157         ServiceInstancesRequest request = new ServiceInstancesRequest();
158         RequestDetails requestDetails = mapRequestDetails(vnf, volumeGroup);
159         request.setRequestDetails(requestDetails);
160         return request;
161     }
162
163     protected ServiceInstancesRequest createServiceInstancesRequest(L3Network network) {
164         ServiceInstancesRequest request = new ServiceInstancesRequest();
165         RequestDetails requestDetails = mapNetworkRequestDetails(network);
166         request.setRequestDetails(requestDetails);
167         return request;
168     }
169
170     protected RequestDetails mapRequestDetails(GenericVnf vnf, VfModule vfModule, ModelType modelType) {
171         RequestDetails requestDetails = new RequestDetails();
172         requestDetails.setRequestInfo(createRequestInfo());
173         if (vfModule.getVfModuleName() != null) {
174             requestDetails.getRequestInfo().setInstanceName(vfModule.getVfModuleName());
175         }
176         requestDetails.setModelInfo(mapVfModuleModelInformation(vfModule, modelType));
177
178         requestDetails.setCloudConfiguration(mapCloudConfiguration(vnf, vfModule));
179         requestDetails.setRequestParameters(createRequestParameters());
180         return requestDetails;
181     }
182
183     protected RequestDetails mapRequestDetails(GenericVnf vnf, VolumeGroup volumeGroup) {
184         RequestDetails requestDetails = new RequestDetails();
185         requestDetails.setRequestInfo(createRequestInfo());
186         if (volumeGroup.getVolumeGroupName() != null) {
187             requestDetails.getRequestInfo().setInstanceName(volumeGroup.getVolumeGroupName());
188         }
189         requestDetails.setModelInfo(mapVolumeGroupModelInformation(volumeGroup));
190         requestDetails.setCloudConfiguration(mapCloudConfigurationVolume(vnf, volumeGroup));
191         requestDetails.setRequestParameters(createRequestParameters());
192         return requestDetails;
193     }
194
195     protected RequestDetails mapVnfRequestDetails(GenericVnf vnf) {
196         RequestDetails requestDetails = new RequestDetails();
197         requestDetails.setRequestInfo(createRequestInfo());
198         if (vnf.getVnfName() != null) {
199             requestDetails.getRequestInfo().setInstanceName(vnf.getVnfName());
200         }
201         requestDetails.setModelInfo(mapVnfModelInformation(vnf));
202         requestDetails.setRequestParameters(createRequestParameters());
203         return requestDetails;
204     }
205
206     protected RequestDetails mapServiceRequestDetails(ServiceInstance serviceInstance) {
207         RequestDetails requestDetails = new RequestDetails();
208         requestDetails.setRequestInfo(createRequestInfo());
209         if (serviceInstance.getServiceInstanceName() != null) {
210             requestDetails.getRequestInfo().setInstanceName(serviceInstance.getServiceInstanceName());
211         }
212         requestDetails.setModelInfo(mapServiceModelInformation(serviceInstance));
213         requestDetails.setRequestParameters(createRequestParameters());
214         return requestDetails;
215     }
216
217     protected RequestDetails mapNetworkRequestDetails(L3Network network) {
218         RequestDetails requestDetails = new RequestDetails();
219         requestDetails.setRequestInfo(createRequestInfo());
220         if (network.getNetworkName() != null) {
221             requestDetails.getRequestInfo().setInstanceName(network.getNetworkName());
222         }
223         requestDetails.setCloudConfiguration(mapCloudConfigurationNetwork(network));
224         requestDetails.setModelInfo(mapNetworkModelInformation(network));
225         requestDetails.setRequestParameters(createRequestParameters());
226         return requestDetails;
227     }
228
229     protected ModelInfo mapVfModuleModelInformation(VfModule vfModule, ModelType modelType) {
230         ModelInfo modelInfo = new ModelInfo();
231         modelInfo.setModelCustomizationId(vfModule.getModelCustomizationId());
232         modelInfo.setModelCustomizationUuid(vfModule.getModelCustomizationId());
233         modelInfo.setModelType(modelType);
234         return modelInfo;
235     }
236
237     protected ModelInfo mapVolumeGroupModelInformation(VolumeGroup volumeGroup) {
238         ModelInfo modelInfo = new ModelInfo();
239         modelInfo.setModelCustomizationId(volumeGroup.getModelCustomizationId());
240         modelInfo.setModelCustomizationUuid(volumeGroup.getModelCustomizationId());
241         modelInfo.setModelType(ModelType.volumeGroup);
242         return modelInfo;
243     }
244
245     protected ModelInfo mapServiceModelInformation(ServiceInstance serviceInstance) {
246         ModelInfo modelInfo = new ModelInfo();
247         modelInfo.setModelVersionId(serviceInstance.getModelVersionId());
248         modelInfo.setModelType(ModelType.service);
249         return modelInfo;
250     }
251
252     protected ModelInfo mapVnfModelInformation(GenericVnf vnf) {
253         ModelInfo modelInfo = new ModelInfo();
254         modelInfo.setModelCustomizationId(vnf.getModelCustomizationId());
255         modelInfo.setModelCustomizationUuid(vnf.getModelCustomizationId());
256         modelInfo.setModelType(ModelType.vnf);
257         return modelInfo;
258     }
259
260     protected ModelInfo mapNetworkModelInformation(L3Network network) {
261         ModelInfo modelInfo = new ModelInfo();
262         modelInfo.setModelType(ModelType.network);
263         modelInfo.setModelCustomizationId(network.getModelCustomizationId());
264         modelInfo.setModelCustomizationUuid(network.getModelCustomizationId());
265         return modelInfo;
266     }
267
268     public CloudConfiguration mapCloudConfiguration(GenericVnf vnf, VfModule vfModule) {
269         CloudConfiguration cloudConfig = new CloudConfiguration();
270         AAIResultWrapper wrapper = new AAIResultWrapper(vnf);
271         Optional<org.onap.so.client.aai.entities.Relationships> relationshipsOpt = wrapper.getRelationships();
272         String tenantId = null;
273         String cloudOwner = null;
274         String lcpRegionId = null;
275         if (relationshipsOpt.isPresent()) {
276             tenantId = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst()
277                     .map(item -> item.getURIKeys().get(TENANT_ID)).orElse(null);
278             cloudOwner = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst()
279                     .map(item -> item.getURIKeys().get(CLOUD_OWNER)).orElse(null);
280             lcpRegionId = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst()
281                     .map(item -> item.getURIKeys().get(CLOUD_REGION_ID)).orElse(null);
282         }
283
284         if (tenantId == null || cloudOwner == null || lcpRegionId == null) {
285             Map<String, String[]> filters = createQueryRequest("vfModuleId", vfModule.getVfModuleId());
286             Optional<ServiceInstancesRequest> request = findServiceInstanceRequest(filters);
287             if (request.isPresent()) {
288                 if (request.get().getRequestDetails() != null
289                         && request.get().getRequestDetails().getCloudConfiguration() != null) {
290                     if (request.get().getRequestDetails().getCloudConfiguration().getTenantId() != null) {
291                         tenantId = request.get().getRequestDetails().getCloudConfiguration().getTenantId();
292                     }
293                     if (request.get().getRequestDetails().getCloudConfiguration().getCloudOwner() != null) {
294                         cloudOwner = request.get().getRequestDetails().getCloudConfiguration().getCloudOwner();
295                     }
296                     if (request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId() != null) {
297                         lcpRegionId = request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId();
298                     }
299                 }
300             } else {
301                 throw new CloudConfigurationNotFoundException(CLOUD_CONFIGURATION_COULD_NOT_BE_FOUND);
302             }
303         }
304         cloudConfig.setTenantId(tenantId);
305         cloudConfig.setCloudOwner(cloudOwner);
306         cloudConfig.setLcpCloudRegionId(lcpRegionId);
307         return cloudConfig;
308     }
309
310     public CloudConfiguration mapCloudConfigurationVolume(GenericVnf vnf, VolumeGroup volumeGroup) {
311         CloudConfiguration cloudConfig = new CloudConfiguration();
312         AAIResultWrapper wrapper = new AAIResultWrapper(vnf);
313         Optional<org.onap.so.client.aai.entities.Relationships> relationshipsOpt = wrapper.getRelationships();
314         String tenantId = null;
315         String cloudOwner = null;
316         String lcpRegionId = null;
317         if (relationshipsOpt.isPresent()) {
318             tenantId = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst()
319                     .map(item -> item.getURIKeys().get(TENANT_ID)).orElse(null);
320             cloudOwner = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst()
321                     .map(item -> item.getURIKeys().get(CLOUD_OWNER)).orElse(null);
322             lcpRegionId = relationshipsOpt.get().getRelatedUris(AAIObjectType.TENANT).stream().findFirst()
323                     .map(item -> item.getURIKeys().get(CLOUD_REGION_ID)).orElse(null);
324         }
325
326         if (tenantId == null || cloudOwner == null || lcpRegionId == null) {
327             Map<String, String[]> filters = createQueryRequest("volumeGroupId", volumeGroup.getVolumeGroupId());
328             Optional<ServiceInstancesRequest> request = findServiceInstanceRequest(filters);
329             if (request.isPresent()) {
330                 tenantId = request.get().getRequestDetails().getCloudConfiguration().getTenantId();
331                 cloudOwner = request.get().getRequestDetails().getCloudConfiguration().getCloudOwner();
332                 lcpRegionId = request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId();
333             } else {
334                 throw new CloudConfigurationNotFoundException(CLOUD_CONFIGURATION_COULD_NOT_BE_FOUND);
335             }
336         }
337         cloudConfig.setTenantId(tenantId);
338         cloudConfig.setCloudOwner(cloudOwner);
339         cloudConfig.setLcpCloudRegionId(lcpRegionId);
340         return cloudConfig;
341     }
342
343     public CloudConfiguration mapCloudConfigurationNetwork(L3Network network) {
344         CloudConfiguration cloudConfig = new CloudConfiguration();
345         String tenantId = null;
346         String cloudOwner = null;
347         String lcpRegionId = null;
348
349         Map<String, String[]> filters = createQueryRequest("networkId", network.getNetworkId());
350         Optional<ServiceInstancesRequest> request = findServiceInstanceRequest(filters);
351         if (request.isPresent()) {
352             if (request.get().getRequestDetails() != null
353                     && request.get().getRequestDetails().getCloudConfiguration() != null) {
354                 if (request.get().getRequestDetails().getCloudConfiguration().getTenantId() != null) {
355                     tenantId = request.get().getRequestDetails().getCloudConfiguration().getTenantId();
356                 }
357                 if (request.get().getRequestDetails().getCloudConfiguration().getCloudOwner() != null) {
358                     cloudOwner = request.get().getRequestDetails().getCloudConfiguration().getCloudOwner();
359                 }
360                 if (request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId() != null) {
361                     lcpRegionId = request.get().getRequestDetails().getCloudConfiguration().getLcpCloudRegionId();
362                 }
363             }
364         } else {
365             throw new CloudConfigurationNotFoundException(CLOUD_CONFIGURATION_COULD_NOT_BE_FOUND);
366         }
367
368         cloudConfig.setTenantId(tenantId);
369         cloudConfig.setCloudOwner(cloudOwner);
370         cloudConfig.setLcpCloudRegionId(lcpRegionId);
371         return cloudConfig;
372     }
373
374     public Optional<ServiceInstancesRequest> findServiceInstanceRequest(Map<String, String[]> filters) {
375         List<InfraActiveRequests> completeRequests = infraActiveRequestsClient.getRequest(filters);
376         InfraActiveRequests foundRequest = completeRequests.get(0);
377         ServiceInstancesRequest siRequest;
378         try {
379             siRequest = mapper.readValue(foundRequest.getRequestBody(), ServiceInstancesRequest.class);
380             return Optional.of(siRequest);
381         } catch (Exception e) {
382             logger.error("Could not read Create Instance Request", e);
383         }
384         return Optional.empty();
385     }
386
387     public Map<String, String[]> createQueryRequest(String name, String instanceId) {
388         Map<String, String[]> filters = new HashMap<>();
389         filters.put(name, new String[] {"EQ", instanceId});
390         filters.put("requestStatus", new String[] {"EQ", Status.COMPLETE.toString()});
391         filters.put("action", new String[] {"EQ", "createInstance"});
392         return filters;
393     }
394
395     public RequestInfo createRequestInfo() {
396         RequestInfo requestInfo = new RequestInfo();
397         requestInfo.setSuppressRollback(false);
398         requestInfo.setSource(MDC.get(ONAPLogConstants.MDCs.PARTNER_NAME));
399         requestInfo.setRequestorId(MDC.get(ONAPLogConstants.MDCs.PARTNER_NAME));
400         return requestInfo;
401     }
402
403     public RequestParameters createRequestParameters() {
404         RequestParameters requestParams = new RequestParameters();
405         requestParams.setaLaCarte(true);
406         requestParams.setTestApi("GR_API");
407         return requestParams;
408     }
409
410     public VfModule getAAIVfModule(String vnfId, String vfModuleId) {
411         return this.getAaiResourcesClient()
412                 .get(VfModule.class, AAIUriFactory.createResourceUri(AAIObjectType.VF_MODULE, vnfId, vfModuleId))
413                 .orElseGet(() -> {
414                     logger.debug("No Vf Module found in A&AI VnfId: {}" + ", VfModuleId: {}", vnfId, vfModuleId);
415                     return null;
416                 });
417     }
418
419     public GenericVnf getGenericVnf(String vnfId) {
420         return this.getAaiResourcesClient()
421                 .get(GenericVnf.class, AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnfId))
422                 .orElseGet(() -> {
423                     logger.debug("No Generic VNF found in A&AI VnfId: {}", vnfId);
424                     return null;
425                 });
426     }
427
428     public VolumeGroup getVolumeGroup(String vnfId, String volumeGroupId) throws AAIEntityNotFound {
429         GenericVnf vnf = getGenericVnf(vnfId);
430         AAIResultWrapper wrapper = new AAIResultWrapper(vnf);
431         List<AAIResourceUri> listVserverWrapper;
432         Optional<AAIResourceUri> volumeGroupURI;
433         if (wrapper.getRelationships().isPresent()) {
434             listVserverWrapper = wrapper.getRelationships().get().getRelatedUris(AAIObjectType.VOLUME_GROUP);
435             volumeGroupURI = listVserverWrapper.stream()
436                     .filter(resourceURI -> resourceURI.getURIKeys().get("volume-group-id").equals(volumeGroupId))
437                     .findFirst();
438         } else {
439             throw new AAIEntityNotFound(
440                     VF_MODULE_NOT_FOUND_IN_INVENTORY_VNF_ID + vnfId + " volumeGroupId: " + volumeGroupId);
441         }
442         return this.getAaiResourcesClient().get(VolumeGroup.class, volumeGroupURI.get()).orElseGet(() -> {
443             logger.debug("No VolumeGroup in A&AI found: {}", vnfId);
444             return null;
445         });
446     }
447
448     public ServiceInstance getServiceInstance(String serviceInstanceId) {
449         return this.getAaiResourcesClient()
450                 .get(ServiceInstance.class,
451                         AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, serviceInstanceId))
452                 .orElseGet(() -> {
453                     logger.debug("No Service Instance found in A&AI ServiceInstanceId: {}", serviceInstanceId);
454                     return null;
455                 });
456     }
457
458     public L3Network getNetwork(String networkId) {
459         return this.getAaiResourcesClient()
460                 .get(L3Network.class, AAIUriFactory.createResourceUri(AAIObjectType.L3_NETWORK, networkId))
461                 .orElseGet(() -> {
462                     logger.debug("No Network found in A&AI NetworkId: {}", networkId);
463                     return null;
464                 });
465     }
466
467     public AAIResourcesClient getAaiResourcesClient() {
468         if (aaiResourcesClient == null) {
469             aaiResourcesClient = new AAIResourcesClient();
470         }
471         return aaiResourcesClient;
472     }
473
474     public void setAaiResourcesClient(AAIResourcesClient aaiResourcesClient) {
475         this.aaiResourcesClient = aaiResourcesClient;
476     }
477
478 }