class BBInputSetup implements JavaDelegate {

    protected GeneralBuildingBlock getGBBMacroExistingService(ExecuteBuildingBlock executeBB,
            Map<ResourceKey, String> lookupKeyMap, String bbName, String requestAction,
            CloudConfiguration cloudConfiguration) throws Exception {
        org.onap.aai.domain.yang.ServiceInstance aaiServiceInstance = null;
        String serviceInstanceId = lookupKeyMap.get(ResourceKey.SERVICE_INSTANCE_ID);
        RequestDetails requestDetails = executeBB.getRequestDetails();
        BBInputSetupParameter parameter =
                new BBInputSetupParameter.Builder().setExecuteBB(executeBB).setLookupKeyMap(lookupKeyMap)
                        .setBbName(bbName).setRequestAction(requestAction).setCloudConfiguration(cloudConfiguration)
                        .setRequestDetails(requestDetails).setResourceId(serviceInstanceId).build();
        GeneralBuildingBlock gBB = null;
        Service service = null;
        if (serviceInstanceId != null) {
            aaiServiceInstance = bbInputSetupUtils.getAAIServiceInstanceById(serviceInstanceId);
            if (aaiServiceInstance != null) {
                service = bbInputSetupUtils.getCatalogServiceByModelUUID(aaiServiceInstance.getModelVersionId());
                if (service == null) {
                    String message = String.format(
                            "Related service instance model not found in MSO CatalogDB: model-version-id=%s",
                            aaiServiceInstance.getModelVersionId());
                    throw new ServiceModelNotFoundException(message);
                }
            } else {
                String message = String.format("Related service instance from AAI not found: service-instance-id=%s",
                        serviceInstanceId);
                throw new NoServiceInstanceFoundException(message);
            }
        }
        ServiceInstance serviceInstance = this.getExistingServiceInstance(aaiServiceInstance);
        serviceInstance.setModelInfoServiceInstance(this.mapperLayer.mapCatalogServiceIntoServiceInstance(service));
        parameter.setServiceInstance(serviceInstance);
        gBB = populateGBBWithSIAndAdditionalInfo(parameter);

        serviceInstance = gBB.getServiceInstance();
        CloudRegion cloudRegion = null;
        if (cloudConfiguration == null) {
            Optional<CloudRegion> cloudRegionOp = cloudInfoFromAAI.getCloudInfoFromAAI(serviceInstance);
            if (cloudRegionOp.isPresent()) {
                cloudRegion = cloudRegionOp.get();
            }
        }
        if (cloudConfiguration != null) {
            org.onap.aai.domain.yang.CloudRegion aaiCloudRegion = bbInputSetupUtils.getCloudRegion(cloudConfiguration);
            cloudRegion = mapperLayer.mapCloudRegion(cloudConfiguration, aaiCloudRegion);
        }
        gBB.setCloudRegion(cloudRegion);
        if (bbName.contains(VNF) || (bbName.contains(CONTROLLER)
                && (VNF).equalsIgnoreCase(executeBB.getBuildingBlock().getBpmnScope()))) {
            for (GenericVnf genericVnf : serviceInstance.getVnfs()) {
                if (lookupKeyMap.get(ResourceKey.GENERIC_VNF_ID) != null
                        && genericVnf.getVnfId().equalsIgnoreCase(lookupKeyMap.get(ResourceKey.GENERIC_VNF_ID))) {
                    org.onap.aai.domain.yang.GenericVnf vnf = bbInputSetupUtils.getAAIGenericVnf(genericVnf.getVnfId());
                    ModelInfo modelInfo = new ModelInfo();
                    if (vnf != null) {
                        modelInfo.setModelCustomizationUuid(vnf.getModelCustomizationId());
                    }
                    this.mapCatalogVnf(genericVnf, modelInfo, service);
                }
            }
        } else if (bbName.contains(VF_MODULE) || (bbName.contains(CONTROLLER)
                && (VF_MODULE).equalsIgnoreCase(executeBB.getBuildingBlock().getBpmnScope()))) {
            for (GenericVnf vnf : serviceInstance.getVnfs()) {
                for (VfModule vfModule : vnf.getVfModules()) {
                    if (lookupKeyMap.get(ResourceKey.VF_MODULE_ID) != null
                            && vfModule.getVfModuleId().equalsIgnoreCase(lookupKeyMap.get(ResourceKey.VF_MODULE_ID))) {
                        String vnfModelCustomizationUUID =
                                this.bbInputSetupUtils.getAAIGenericVnf(vnf.getVnfId()).getModelCustomizationId();
                        ModelInfo vnfModelInfo = new ModelInfo();
                        vnfModelInfo.setModelCustomizationUuid(vnfModelCustomizationUUID);
                        this.mapCatalogVnf(vnf, vnfModelInfo, service);
                        lookupKeyMap.put(ResourceKey.GENERIC_VNF_ID, vnf.getVnfId());
                        String vfModuleCustomizationUUID = this.bbInputSetupUtils
                                .getAAIVfModule(vnf.getVnfId(), vfModule.getVfModuleId()).getModelCustomizationId();
                        ModelInfo vfModuleModelInfo = new ModelInfo();
                        vfModuleModelInfo.setModelCustomizationId(vfModuleCustomizationUUID);
                        this.mapCatalogVfModule(vfModule, vfModuleModelInfo, service, vnfModelCustomizationUUID);
                        if (cloudRegion != null) {
                            Optional<String> volumeGroupIdOp = getVolumeGroupIdRelatedToVfModule(vnf, vfModuleModelInfo,
                                    cloudRegion.getCloudOwner(), cloudRegion.getLcpCloudRegionId(), lookupKeyMap);
                            if (volumeGroupIdOp.isPresent()) {
                                lookupKeyMap.put(ResourceKey.VOLUME_GROUP_ID, volumeGroupIdOp.get());
                            }
                        }
                        break;
                    }
                }
            }
        } else if (bbName.contains(VOLUME_GROUP)) {
            for (GenericVnf vnf : serviceInstance.getVnfs()) {
                for (VolumeGroup volumeGroup : vnf.getVolumeGroups()) {
                    if (lookupKeyMap.get(ResourceKey.VOLUME_GROUP_ID) != null && volumeGroup.getVolumeGroupId()
                            .equalsIgnoreCase(lookupKeyMap.get(ResourceKey.VOLUME_GROUP_ID))) {
                        String vnfModelCustomizationUUID =
                                this.bbInputSetupUtils.getAAIGenericVnf(vnf.getVnfId()).getModelCustomizationId();
                        ModelInfo vnfModelInfo = new ModelInfo();
                        vnfModelInfo.setModelCustomizationUuid(vnfModelCustomizationUUID);
                        this.mapCatalogVnf(vnf, vnfModelInfo, service);
                        lookupKeyMap.put(ResourceKey.GENERIC_VNF_ID, vnf.getVnfId());
                        if (cloudRegion != null) {
                            String volumeGroupCustomizationUUID =
                                    this.bbInputSetupUtils
                                            .getAAIVolumeGroup(cloudRegion.getCloudOwner(),
                                                    cloudRegion.getLcpCloudRegionId(), volumeGroup.getVolumeGroupId())
                                            .getModelCustomizationId();
                            ModelInfo volumeGroupModelInfo = new ModelInfo();
                            volumeGroupModelInfo.setModelCustomizationId(volumeGroupCustomizationUUID);
                            this.mapCatalogVolumeGroup(volumeGroup, volumeGroupModelInfo, service,
                                    vnfModelCustomizationUUID);
                        }
                        break;
                    }
                }
            }
        } else if (bbName.contains(NETWORK)) {
            for (L3Network network : serviceInstance.getNetworks()) {
                if (lookupKeyMap.get(ResourceKey.NETWORK_ID) != null
                        && network.getNetworkId().equalsIgnoreCase(lookupKeyMap.get(ResourceKey.NETWORK_ID))) {
                    String networkCustomizationUUID =
                            this.bbInputSetupUtils.getAAIL3Network(network.getNetworkId()).getModelCustomizationId();
                    ModelInfo modelInfo = new ModelInfo();
                    modelInfo.setModelCustomizationUuid(networkCustomizationUUID);
                    this.mapCatalogNetwork(network, modelInfo, service);
                    break;
                }
            }
        } else if (bbName.contains("Fabric")) {
            for (Configuration configuration : serviceInstance.getConfigurations()) {
                if (lookupKeyMap.get(ResourceKey.CONFIGURATION_ID) != null && configuration.getConfigurationId()
                        .equalsIgnoreCase(lookupKeyMap.get(ResourceKey.CONFIGURATION_ID))) {
                    String configurationCustUUID = this.bbInputSetupUtils
                            .getAAIConfiguration(configuration.getConfigurationId()).getModelCustomizationId();
                    ModelInfo modelInfo = new ModelInfo();
                    modelInfo.setModelCustomizationUuid(configurationCustUUID);
                    this.mapCatalogConfiguration(configuration, modelInfo, service,
                            executeBB.getConfigurationResourceKeys());
                    break;
                }
            }
        }
        if (executeBB.getWorkflowResourceIds() != null) {
            parameter.setResourceId(executeBB.getWorkflowResourceIds().getNetworkCollectionId());
            parameter.setKey(executeBB.getBuildingBlock().getKey());
            this.populateNetworkCollectionAndInstanceGroupAssign(parameter);
        }
        return gBB;
    }

}