Unique identifier for test execution
[sdc.git] / openecomp-be / backend / openecomp-sdc-vendor-software-product-manager / src / main / java / org / openecomp / sdc / vendorsoftwareproduct / impl / VendorSoftwareProductManagerImpl.java
index 4a44076..7de39a4 100644 (file)
@@ -135,852 +135,819 @@ import org.openecomp.sdc.versioning.dao.types.Version;
 
 public class VendorSoftwareProductManagerImpl implements VendorSoftwareProductManager {
 
-  private VspMergeDao vspMergeDao;
-  private OrchestrationTemplateDao orchestrationTemplateDao;
-  private OrchestrationTemplateCandidateManager orchestrationTemplateCandidateManager;
-  private VendorSoftwareProductInfoDao vspInfoDao;
-  private VendorLicenseFacade vendorLicenseFacade;
-  private ServiceModelDao<ToscaServiceModel, ServiceElement> serviceModelDao;
-  private EnrichedServiceModelDao<ToscaServiceModel, ServiceElement> enrichedServiceModelDao;
-  private VendorLicenseArtifactsService licenseArtifactsService;
-  private InformationArtifactGenerator informationArtifactGenerator;
-  private PackageInfoDao packageInfoDao;
-  private DeploymentFlavorDao deploymentFlavorDao;
-  private ComponentDao componentDao;
-  private ComponentDependencyModelDao componentDependencyModelDao;
-  private NicDao nicDao;
-  private ComputeDao computeDao;
-  private ImageDao imageDao;
-  private ManualVspToscaManager manualVspToscaManager;
-  private UniqueValueUtil uniqueValueUtil;
-  private CandidateService candidateService;
-
-  @Override
-  public ValidationResponse validate(VspDetails vspDetails) throws IOException {
-    List<ErrorCode> vspErrors = new ArrayList<>(validateVspFields(vspDetails));
-    ValidationResponse validationResponse = new ValidationResponse();
-    if (Objects.nonNull(vspDetails.getOnboardingMethod())
-        && OnboardingMethod.Manual.name().equals(vspDetails.getOnboardingMethod())) {
-      validateManualOnboardingMethod(vspDetails, validationResponse, vspErrors);
-    } else {
-      validateOrchestrationTemplateCandidate(validationResponse, vspErrors, vspDetails.getId(), vspDetails.getVersion());
-      if (!validationResponse.isValid()) {
+    private VspMergeDao vspMergeDao;
+    private OrchestrationTemplateDao orchestrationTemplateDao;
+    private OrchestrationTemplateCandidateManager orchestrationTemplateCandidateManager;
+    private VendorSoftwareProductInfoDao vspInfoDao;
+    private VendorLicenseFacade vendorLicenseFacade;
+    private ServiceModelDao<ToscaServiceModel, ServiceElement> serviceModelDao;
+    private EnrichedServiceModelDao<ToscaServiceModel, ServiceElement> enrichedServiceModelDao;
+    private VendorLicenseArtifactsService licenseArtifactsService;
+    private InformationArtifactGenerator informationArtifactGenerator;
+    private PackageInfoDao packageInfoDao;
+    private DeploymentFlavorDao deploymentFlavorDao;
+    private ComponentDao componentDao;
+    private ComponentDependencyModelDao componentDependencyModelDao;
+    private NicDao nicDao;
+    private ComputeDao computeDao;
+    private ImageDao imageDao;
+    private ManualVspToscaManager manualVspToscaManager;
+    private UniqueValueUtil uniqueValueUtil;
+    private CandidateService candidateService;
+
+    @Override
+    public ValidationResponse validate(VspDetails vspDetails) throws IOException {
+        List<ErrorCode> vspErrors = new ArrayList<>(validateVspFields(vspDetails));
+        ValidationResponse validationResponse = new ValidationResponse();
+        if (Objects.nonNull(vspDetails.getOnboardingMethod()) && OnboardingMethod.Manual.name()
+                                                                         .equals(vspDetails.getOnboardingMethod())) {
+            validateManualOnboardingMethod(vspDetails, validationResponse, vspErrors);
+        } else {
+            validateOrchestrationTemplateCandidate(validationResponse, vspErrors, vspDetails.getId(),
+                    vspDetails.getVersion());
+            if (!validationResponse.isValid()) {
+                return validationResponse;
+            }
+            validateLicense(vspDetails, vspErrors);
+            OrchestrationTemplateEntity orchestrationTemplate =
+                    orchestrationTemplateDao.get(vspDetails.getId(), vspDetails.getVersion());
+            ToscaServiceModel serviceModel =
+                    serviceModelDao.getServiceModel(vspDetails.getId(), vspDetails.getVersion());
+            if (isOrchestrationTemplateMissing(orchestrationTemplate) || isServiceModelMissing(serviceModel)) {
+                vspErrors.add(VendorSoftwareProductInvalidErrorBuilder
+                                      .vendorSoftwareProductMissingServiceModelErrorBuilder(vspDetails.getId(),
+                                              vspDetails.getVersion()));
+            }
+            validationResponse.setUploadDataErrors(validateOrchestrationTemplate(orchestrationTemplate));
+        }
+
+        QuestionnaireValidationResult questionnaireValidationResult =
+                validateQuestionnaire(vspDetails.getId(), vspDetails.getVersion(), vspDetails.getOnboardingMethod());
+
+        if (Objects.nonNull(questionnaireValidationResult)) {
+            if (validationResponse.getQuestionnaireValidationResult() == null
+                        || validationResponse.getQuestionnaireValidationResult().getValidationData() == null) {
+                validationResponse.setQuestionnaireValidationResult(questionnaireValidationResult);
+            } else {
+                validationResponse.getQuestionnaireValidationResult().getValidationData()
+                        .addAll(questionnaireValidationResult.getValidationData());
+            }
+        }
+
+        Collection<ComponentDependencyModelEntity> componentDependencies = componentDependencyModelDao
+                                                                                   .list(new ComponentDependencyModelEntity(
+                                                                                           vspDetails.getId(),
+                                                                                           vspDetails.getVersion(),
+                                                                                           null));
+
+        if (validateComponentDependencies(componentDependencies)) {
+            vspErrors.add(ComponentDependencyModelErrorBuilder.getCyclicDependencyComponentErrorBuilder());
+        }
+        validationResponse.setVspErrors(vspErrors);
+        validationResponse.setLicensingDataErrors(validateLicensingData(vspDetails));
         return validationResponse;
-      }
-      validateLicense(vspDetails, vspErrors);
-      OrchestrationTemplateEntity orchestrationTemplate =
-          orchestrationTemplateDao.get(vspDetails.getId(), vspDetails.getVersion());
-      ToscaServiceModel serviceModel =
-          serviceModelDao.getServiceModel( vspDetails.getId(), vspDetails.getVersion());
-      if (isOrchestrationTemplateMissing(orchestrationTemplate)
-          || isServiceModelMissing(serviceModel)) {
-        vspErrors.add(VendorSoftwareProductInvalidErrorBuilder
-            .vendorSoftwareProductMissingServiceModelErrorBuilder(vspDetails.getId(),
-                vspDetails.getVersion()));
-      }
-      validationResponse.setUploadDataErrors(validateOrchestrationTemplate(orchestrationTemplate));
-    }
-
-    QuestionnaireValidationResult questionnaireValidationResult = validateQuestionnaire
-        (vspDetails.getId(), vspDetails.getVersion(), vspDetails.getOnboardingMethod());
-
-    if (Objects.nonNull(questionnaireValidationResult)) {
-      if (validationResponse.getQuestionnaireValidationResult() == null || validationResponse
-          .getQuestionnaireValidationResult().getValidationData() == null) {
-        validationResponse.setQuestionnaireValidationResult(questionnaireValidationResult);
-      } else {
-        validationResponse.getQuestionnaireValidationResult().getValidationData().addAll
-            (questionnaireValidationResult.getValidationData());
-      }
-    }
-
-    Collection<ComponentDependencyModelEntity> componentDependencies =
-        componentDependencyModelDao.list(new ComponentDependencyModelEntity(vspDetails.getId(), vspDetails.getVersion(), null));
-
-    if (validateComponentDependencies(componentDependencies)) {
-      vspErrors
-          .add(ComponentDependencyModelErrorBuilder.getCyclicDependencyComponentErrorBuilder());
-    }
-    validationResponse
-        .setVspErrors(vspErrors);
-    validationResponse.setLicensingDataErrors(validateLicensingData(vspDetails));
-    return validationResponse;
-  }
-
-  private void validateLicense(VspDetails vspDetails, List<ErrorCode> vspErrors) {
-    if (vspDetails.getVlmVersion() != null || vspDetails.getLicenseAgreement() != null
-            || vspDetails.getFeatureGroups() != null) {
-      vspErrors.addAll(validateMandatoryLicenseFields(vspDetails));
-    }
-  }
-
-  private void validateOrchestrationTemplateCandidate(ValidationResponse validationResponse,
-                                                      List<ErrorCode> vspErrors, String vspId,
-                                                      Version version) {
-    orchestrationTemplateCandidateManager.getInfo(vspId, version)
-        .ifPresent(candidateInfo -> {
-          String fileName = candidateInfo.getFileName();
-          vspErrors.add(candidateInfo.getValidationData().isEmpty()
-              ? candidateDataNotProcessedOrAbortedErrorBuilder(fileName)
-              : invalidProcessedCandidate(fileName));
-          validationResponse.setVspErrors(vspErrors);
+    }
+
+    private void validateLicense(VspDetails vspDetails, List<ErrorCode> vspErrors) {
+        if (vspDetails.getVlmVersion() != null || vspDetails.getLicenseAgreement() != null
+                    || vspDetails.getFeatureGroups() != null) {
+            vspErrors.addAll(validateMandatoryLicenseFields(vspDetails));
+        }
+    }
+
+    private void validateOrchestrationTemplateCandidate(ValidationResponse validationResponse,
+            List<ErrorCode> vspErrors, String vspId, Version version) {
+        orchestrationTemplateCandidateManager.getInfo(vspId, version).ifPresent(candidateInfo -> {
+            String fileName = candidateInfo.getFileName();
+            vspErrors.add(candidateInfo.getValidationData().isEmpty() ? candidateDataNotProcessedOrAbortedErrorBuilder(
+                    fileName) : invalidProcessedCandidate(fileName));
+            validationResponse.setVspErrors(vspErrors);
         });
-  }
-
-  private void validateManualOnboardingMethod(VspDetails vspDetails,
-                                              ValidationResponse validationResponse,
-                                              List<ErrorCode> vspErrors) {
-    vspErrors.addAll(validateMandatoryLicenseFields(vspDetails));
-
-    Collection<DeploymentFlavorEntity> deploymentFlavors = deploymentFlavorDao
-        .list(new DeploymentFlavorEntity(vspDetails.getId(), vspDetails.getVersion(), null));
-    if (CollectionUtils.isEmpty(deploymentFlavors)) {
-      vspErrors.add(vspMissingDeploymentFlavorErrorBuilder());
-    }
-    vspErrors.addAll(validateDeploymentFlavors(deploymentFlavors));
-
-    Set<CompositionEntityValidationData> componentValidationResult =
-        componentValidation(vspDetails.getId(), vspDetails.getVersion());
-    if (!CollectionUtils.isEmpty(componentValidationResult)) {
-      if (validationResponse.getQuestionnaireValidationResult() == null
-          || validationResponse.getQuestionnaireValidationResult().getValidationData() == null) {
-        validationResponse.setQuestionnaireValidationResult(
-            new QuestionnaireValidationResult(componentValidationResult));
-      } else {
-        validationResponse.getQuestionnaireValidationResult().getValidationData()
-            .addAll(componentValidationResult);
-      }
-    }
-  }
-
-  @Override
-  public Map<String, List<ErrorMessage>> compile(String vspId, Version version) {
-    ToscaServiceModel serviceModel =
-        OnboardingMethod.Manual.name().equals(getValidatedVsp(vspId, version).getOnboardingMethod())
-            //Generate Tosca service model for Manual Onboarding flow
-            ? manualVspToscaManager
-            .generateToscaModel(manualVspToscaManager.gatherVspInformation(vspId, version))
-            : serviceModelDao.getServiceModel(vspId, version);
-
-    return compile(vspId, version, serviceModel);
-  }
-
-  private boolean validateComponentDependencies(
-      Collection<ComponentDependencyModelEntity> componentDependencies) {
-    ComponentDependencyTracker dependencyTracker = new ComponentDependencyTracker();
-
-    for (ComponentDependencyModelEntity componentDependency : componentDependencies) {
-      dependencyTracker.addDependency(componentDependency.getSourceComponentId(),
-          componentDependency.getTargetComponentId());
-    }
-    return dependencyTracker.isCyclicDependencyPresent();
-  }
-
-  private Collection<ErrorCode> validateDeploymentFlavors(
-      Collection<DeploymentFlavorEntity> deploymentFlavors) {
-
-    Collection<ErrorCode> errorCodeList = new ArrayList<>();
-    if (!CollectionUtils.isEmpty(deploymentFlavors)) {
-      deploymentFlavors.forEach(deploymentFlavor -> {
-        DeploymentFlavorEntity deployment = deploymentFlavorDao.get(deploymentFlavor);
-        DeploymentFlavor deploymentLocalFlavor = deployment.getDeploymentFlavorCompositionData();
-        if (deploymentLocalFlavor != null) {
-          if (deploymentLocalFlavor.getFeatureGroupId() == null) {
-            ErrorCode deploymentFlavorErrorBuilder = DeploymentFlavorErrorBuilder.
-                getFeatureGroupMandatoryErrorBuilder(deploymentLocalFlavor.getModel());
-            errorCodeList.add(deploymentFlavorErrorBuilder);
-          }
-          validateComponentComputeAssociations(errorCodeList, deploymentFlavor,
-              deployment, deploymentLocalFlavor);
-        }
-      });
-    }
-    return errorCodeList;
-  }
-
-  private void validateComponentComputeAssociations(Collection<ErrorCode> errorCodeList,
-                                                    DeploymentFlavorEntity deploymentFlavor,
-                                                    DeploymentFlavorEntity deployment,
-                                                    DeploymentFlavor deploymentlocalFlavor) {
-    List<ComponentComputeAssociation> componentComputeAssociations =
-        deploymentlocalFlavor.getComponentComputeAssociations();
-    if (CollectionUtils.isEmpty(componentComputeAssociations)) {
-        validateCompositionEntity(errorCodeList, deploymentFlavor, deployment, deploymentlocalFlavor);
-    } else {
-      componentComputeAssociations.forEach(componentComputeAssociation -> {
-        if (componentComputeAssociation == null
-            || !(componentComputeAssociation.getComponentId() != null
-            && componentComputeAssociation.getComputeFlavorId() != null)) {
-            validateCompositionEntity(errorCodeList, deploymentFlavor, deployment, deploymentlocalFlavor);
+    }
+
+    private void validateManualOnboardingMethod(VspDetails vspDetails, ValidationResponse validationResponse,
+            List<ErrorCode> vspErrors) {
+        vspErrors.addAll(validateMandatoryLicenseFields(vspDetails));
+
+        Collection<DeploymentFlavorEntity> deploymentFlavors =
+                deploymentFlavorDao.list(new DeploymentFlavorEntity(vspDetails.getId(), vspDetails.getVersion(), null));
+        if (CollectionUtils.isEmpty(deploymentFlavors)) {
+            vspErrors.add(vspMissingDeploymentFlavorErrorBuilder());
+        }
+        vspErrors.addAll(validateDeploymentFlavors(deploymentFlavors));
+
+        Set<CompositionEntityValidationData> componentValidationResult =
+                componentValidation(vspDetails.getId(), vspDetails.getVersion());
+        if (!CollectionUtils.isEmpty(componentValidationResult)) {
+            if (validationResponse.getQuestionnaireValidationResult() == null
+                        || validationResponse.getQuestionnaireValidationResult().getValidationData() == null) {
+                validationResponse
+                        .setQuestionnaireValidationResult(new QuestionnaireValidationResult(componentValidationResult));
+            } else {
+                validationResponse.getQuestionnaireValidationResult().getValidationData()
+                        .addAll(componentValidationResult);
+            }
         }
-      });
-    }
-  }
-
-  private void validateCompositionEntity(Collection<ErrorCode> errorCodeList,
-                                                                             DeploymentFlavorEntity deploymentFlavor,
-                                                                             DeploymentFlavorEntity deployment,
-                                                                             DeploymentFlavor deploymentlocalFlavor){
-    CompositionEntityValidationData compositionEntityValidationData = new
-            CompositionEntityValidationData(CompositionEntityType.deployment, deploymentFlavor
-            .getId());
-    compositionEntityValidationData.setEntityName(deployment
-            .getDeploymentFlavorCompositionData().getModel());
-    ErrorCode deploymentFlavorErrorBuilder = DeploymentFlavorErrorBuilder
-            .getInvalidComponentComputeAssociationErrorBuilder(
-                    deploymentlocalFlavor.getModel());
-    errorCodeList.add(deploymentFlavorErrorBuilder);
-  }
-
-  private Set<CompositionEntityValidationData> componentValidation(String vspId, Version version) {
-    Set<CompositionEntityValidationData> validationData = new HashSet<>();
-    Collection<ComponentEntity> components =
-        componentDao.list(new ComponentEntity(vspId, version, null));
-    if (!CollectionUtils.isEmpty(components)) {
-      components.forEach(component -> {
-        validateImage(vspId, version, validationData, component);
-        validateNic(vspId, version, validationData, component);
-
-      });
-    }
-
-    return validationData;
-  }
-
-  private void validateNic(String vspId, Version version,
-                           Set<CompositionEntityValidationData> validationData,
-                           ComponentEntity component) {
-    Collection<NicEntity> nics =
-        nicDao.list(new NicEntity(vspId, version, component.getId(), null));
-    if (CollectionUtils.isNotEmpty(nics)) {
-      nics.forEach(nicEntity -> {
-        NicEntity nic = nicDao.get(new NicEntity(vspId, version, component.getId(),
-            nicEntity.getId()));
-        NetworkType networkType = nic.getNicCompositionData().getNetworkType();
-        String networkId = nic.getNicCompositionData().getNetworkId();
-        if (networkType.equals(NetworkType.Internal) && networkId == null) {
-          CompositionEntityValidationData compositionEntityValidationData = new
-              CompositionEntityValidationData(CompositionEntityType.nic, nic.getId());
-          compositionEntityValidationData.setEntityName(nic.getNicCompositionData().getName());
-          ErrorCode nicInternalNetworkErrorBuilder = NicInternalNetworkErrorBuilder
-              .getNicNullNetworkIdInternalNetworkIdErrorBuilder();
-          List<String> errors = new ArrayList<>();
-          errors.add(nicInternalNetworkErrorBuilder.message());
-          compositionEntityValidationData.setErrors(errors);
-          validationData.add(compositionEntityValidationData);
-        }
-      });
-    }
-  }
-
-  private void validateImage(String vspId, Version version,
-                             Set<CompositionEntityValidationData> validationData,
-                             ComponentEntity component) {
-    Collection<ImageEntity> images =
-        imageDao.list(new ImageEntity(vspId, version, component.getId(), null));
-    if (CollectionUtils.isEmpty(images)) {
-      CompositionEntityValidationData compositionEntityValidationData = new
-          CompositionEntityValidationData(component.getType(), component.getId());
-      compositionEntityValidationData
-          .setEntityName(component.getComponentCompositionData().getDisplayName());
-      ErrorCode vfcMissingImageErrorBuilder =
-          ComponentErrorBuilder.vfcMissingImageErrorBuilder();
-      List<String> errors = new ArrayList<>();
-      errors.add(vfcMissingImageErrorBuilder.message());
-      compositionEntityValidationData.setErrors(errors);
-      validationData.add(compositionEntityValidationData);
-    }
-  }
-
-  private List<ErrorCode> validateVspFields(VspDetails vspDetails) {
-    List<ErrorCode> errors = new ArrayList<>();
-
-    if (vspDetails.getName() == null) {
-      errors.add(createMissingMandatoryFieldError("name"));
-    }
-    if (vspDetails.getDescription() == null) {
-      errors.add(createMissingMandatoryFieldError("description"));
-    }
-    if (vspDetails.getVendorId() == null) {
-      errors.add(createMissingMandatoryFieldError("vendor Id"));
-    }
-    if (vspDetails.getCategory() == null) {
-      errors.add(createMissingMandatoryFieldError("category"));
-    }
-    if (vspDetails.getSubCategory() == null) {
-      errors.add(createMissingMandatoryFieldError("sub category"));
-    }
-    return errors;
-  }
-
-  private List<ErrorCode> validateMandatoryLicenseFields(VspDetails vspDetails) {
-    List<ErrorCode> errors = new ArrayList<>();
-    if (vspDetails.getVlmVersion() == null) {
-      errors.add(createMissingMandatoryFieldError("licensing version"));
-    }
-    if (vspDetails.getLicenseAgreement() == null) {
-      errors.add(createMissingMandatoryFieldError("license agreement"));
-    }
-    if (CollectionUtils.isEmpty(vspDetails.getFeatureGroups())) {
-      errors.add(createMissingMandatoryFieldError("feature groups"));
-    }
-    return errors;
-  }
-
-  private static ErrorCode createMissingMandatoryFieldError(String fieldName) {
-    return new ValidationErrorBuilder("must be supplied", fieldName).build();
-  }
-
-  private Map<String, List<ErrorMessage>> compile(String vendorSoftwareProductId, Version version,
-                                                  ToscaServiceModel serviceModel) {
-    if (isServiceModelMissing(serviceModel)) {
-      return null;
-    }
-
-    enrichedServiceModelDao.deleteAll(vendorSoftwareProductId, version);
-
-    EnrichmentManager<ToscaServiceModel> enrichmentManager =
-        EnrichmentManagerFactory.getInstance().createInterface();
-    enrichmentManager.init(vendorSoftwareProductId, version);
-    enrichmentManager.setModel(serviceModel);
-    Map<String, List<ErrorMessage>> enrichErrors = enrichmentManager.enrich();
-
-    enrichedServiceModelDao
-        .storeServiceModel(vendorSoftwareProductId, version, enrichmentManager.getModel());
-
-    return enrichErrors;
-  }
-
-  private Collection<ErrorCode> validateLicensingData(VspDetails vspDetails) {
-    if (vspDetails.getVendorId() != null) {
-      Optional<ErrorCode> errorCode = vendorLicenseFacade.validateVendorForUsage(vspDetails.getVendorId(),vspDetails.getVlmVersion());
-      if (errorCode.isPresent()) {
-        return Collections.singleton(errorCode.get());
-      }
-    }
-
-    if (vspDetails.getVendorId() == null || vspDetails.getVlmVersion() == null
-        || vspDetails.getLicenseAgreement() == null
-        || CollectionUtils.isEmpty(vspDetails.getFeatureGroups())) {
-      return Collections.emptyList();
-    }
-    return vendorLicenseFacade
-        .validateLicensingData(vspDetails.getVendorId(), vspDetails.getVlmVersion(),
-            vspDetails.getLicenseAgreement(), vspDetails.getFeatureGroups());
-  }
-
-  @Override
-  public VspDetails createVsp(VspDetails vspDetails) {
-    vspInfoDao.create(vspDetails);
-    vspInfoDao.updateQuestionnaireData(vspDetails.getId(), vspDetails.getVersion(),
-        new JsonSchemaDataGenerator(getVspQuestionnaireSchema(null)).generateData());
-    return vspDetails;
-  }
-
-  @Override
-  public void updateVsp(VspDetails vspDetails) {
-    VspDetails retrieved = vspInfoDao.get(vspDetails);
-    if (retrieved == null) {
-      throw new CoreException((new ErrorCode.ErrorCodeBuilder()
-          .withMessage(String.format("Vsp with id %s and version %s does not exist.",
-              vspDetails.getId(), vspDetails.getVersion().getId()))).build());
     }
-    vspDetails.setOnboardingMethod(retrieved.getOnboardingMethod());
 
-    //If any existing feature group is removed from VSP which is also associated in DF then
-    //update DF to remove feature group associations.
-    updateDeploymentFlavor(vspDetails);
+    @Override
+    public Map<String, List<ErrorMessage>> compile(String vspId, Version version) {
+        ToscaServiceModel serviceModel =
+                OnboardingMethod.Manual.name().equals(getValidatedVsp(vspId, version).getOnboardingMethod())
+                        //Generate Tosca service model for Manual Onboarding flow
+                        ? manualVspToscaManager
+                                  .generateToscaModel(manualVspToscaManager.gatherVspInformation(vspId, version))
+                        : serviceModelDao.getServiceModel(vspId, version);
 
-    updateUniqueName(retrieved.getName(), vspDetails.getName());
-    vspInfoDao.update(vspDetails);
-  }
+        return compile(vspId, version, serviceModel);
+    }
 
-  private void updateDeploymentFlavor(VspDetails vspDetails) {
-    final List<String> featureGroups = vspDetails.getFeatureGroups();
-    if (featureGroups != null) {
-      final Collection<DeploymentFlavorEntity> deploymentFlavorEntities = deploymentFlavorDao
-          .list(new DeploymentFlavorEntity(vspDetails.getId(), vspDetails
-              .getVersion(), null));
-      if (Objects.nonNull(deploymentFlavorEntities)) {
-        for (DeploymentFlavorEntity deploymentFlavorEntity : deploymentFlavorEntities) {
-          updateDeploymentFlavourEntity(featureGroups, deploymentFlavorEntity);
-        }
-      }
-    }
-  }
-
-  private void updateDeploymentFlavourEntity(List<String> featureGroups,
-                                             DeploymentFlavorEntity deploymentFlavorEntity) {
-    final String featureGroupId =
-        deploymentFlavorEntity.getDeploymentFlavorCompositionData().getFeatureGroupId();
-    if (!featureGroups.contains(featureGroupId)) {
-      DeploymentFlavor deploymentFlavorCompositionData =
-          deploymentFlavorEntity.getDeploymentFlavorCompositionData();
-      deploymentFlavorCompositionData.setFeatureGroupId(null);
-      deploymentFlavorEntity.setDeploymentFlavorCompositionData
-          (deploymentFlavorCompositionData);
-      deploymentFlavorDao.update(deploymentFlavorEntity);
-    }
-  }
-
-
-  @Override
-  public VspDetails getVsp(String vspId, Version version) {
-    return getValidatedVsp(vspId, version);
-  }
-
-  private VspDetails getValidatedVsp(String vspId, Version version) {
-    VspDetails vsp = vspInfoDao.get(new VspDetails(vspId, version));
-    if (vsp == null) {
-      throw new CoreException(new VendorSoftwareProductNotFoundErrorBuilder(vspId).build());
-    }
-    return vsp;
-  }
-
-  @Override
-  public void deleteVsp(String vspId, Version version) {
-    vspMergeDao.deleteHint(vspId, version);
-  }
-
-  @Override
-  public List<PackageInfo> listPackages(String category, String subCategory) {
-    return packageInfoDao.listByCategory(category, subCategory);
-  }
-
-  @Override
-  public File getTranslatedFile(String vspId, Version version) {
-    PackageInfo packageInfo = packageInfoDao.get(new PackageInfo(vspId, version));
-    if (packageInfo == null) {
-      throw new CoreException(new PackageNotFoundErrorBuilder(vspId, version).build());
-    }
-
-    ByteBuffer translatedFileBuffer = packageInfo.getTranslatedFile();
-    if (translatedFileBuffer == null) {
-      throw new CoreException(new PackageInvalidErrorBuilder(vspId, version).build());
-    }
-
-    File translatedFile = new File(VendorSoftwareProductConstants.VSP_PACKAGE_ZIP);
-
-    try (FileOutputStream fos = new FileOutputStream(translatedFile)) {
-      fos.write(translatedFileBuffer.array());
-    } catch (IOException exception) {
-      throw new CoreException(new TranslationFileCreationErrorBuilder(vspId, version).build(),
-          exception);
-    }
-    return translatedFile;
-  }
-
-  @Override
-  public byte[] getOrchestrationTemplateFile(String vspId, Version version) {
-    OrchestrationTemplateEntity uploadData = orchestrationTemplateDao.get(vspId, version);
-    ByteBuffer contentData = uploadData.getContentData();
-    if (contentData == null) {
-      return new byte[0];
-    }
-
-    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
-    try (final ZipOutputStream zos = new ZipOutputStream(baos);
-         ZipInputStream ignored = new ZipInputStream(
-             new ByteArrayInputStream(contentData.array()))) {
-      zos.write(contentData.array());
-    } catch (IOException exception) {
-      throw new CoreException(new FileCreationErrorBuilder(vspId).build(), exception);
-    }
-    return baos.toByteArray();
-  }
-
-  @Override
-  public OrchestrationTemplateEntity getOrchestrationTemplateInfo(String vspId, Version version) {
-    return orchestrationTemplateDao.getInfo(vspId, version);
-  }
-
-  @Override
-  public Optional<FilesDataStructure> getOrchestrationTemplateStructure(String vspId,
-                                                                        Version version) {
-    Optional<String> jsonFileDataStructure =
-        orchestrationTemplateDao.getOrchestrationTemplateStructure(vspId, version);
-
-    if (jsonFileDataStructure.isPresent() && JsonUtil.isValidJson(jsonFileDataStructure.get())) {
-      return Optional
-          .of(JsonUtil.json2Object(jsonFileDataStructure.get(), FilesDataStructure.class));
-    } else {
-      return Optional.empty();
-    }
-  }
-
-  @Override
-  public PackageInfo createPackage(final String vspId, final Version version) throws IOException {
-      final ToscaServiceModel toscaServiceModel = enrichedServiceModelDao.getServiceModel(vspId, version);
-      final VspDetails vspDetails = vspInfoDao.get(new VspDetails(vspId, version));
-      final Version vlmVersion = vspDetails.getVlmVersion();
-    if (vlmVersion != null) {
-      populateVersionsForVlm(vspDetails.getVendorId(), vlmVersion);
-    }
-      final PackageInfo packageInfo = createPackageInfo(vspDetails);
-
-      final ToscaFileOutputServiceCsarImpl toscaServiceTemplateServiceCsar =
-        new ToscaFileOutputServiceCsarImpl();
-      final FileContentHandler licenseArtifacts = licenseArtifactsService
-        .createLicenseArtifacts(vspDetails.getId(), vspDetails.getVendorId(), vlmVersion,
-            vspDetails.getFeatureGroups());
-      final ETSIService etsiService = new ETSIServiceImpl();
-    if (etsiService.isSol004WithToscaMetaDirectory(toscaServiceModel.getArtifactFiles())) {
-        final FileContentHandler handler = toscaServiceModel.getArtifactFiles();
-      final Manifest manifest = etsiService.getManifest(handler);
-      final Optional<Map<String, Path>> fromToMovedPaths = etsiService.moveNonManoFileToArtifactFolder(handler);
-      fromToMovedPaths
-          .ifPresent(it -> etsiService.updateMainDescriptorPaths(toscaServiceModel, it));
-      packageInfo.setResourceType(etsiService.getResourceType(manifest).name());
-    }
-    packageInfo.setTranslatedFile(ByteBuffer.wrap(
-        toscaServiceTemplateServiceCsar.createOutputFile(toscaServiceModel, licenseArtifacts)));
-
-    packageInfoDao.create(packageInfo);
-    return packageInfo;
-  }
-
-  void populateVersionsForVlm(String vlmId, Version vlmVersion) {
-    VersioningManager versioningManager = VersioningManagerFactory.getInstance().createInterface();
-    versioningManager.list(vlmId).stream()
-        .filter(version -> version.getId().equalsIgnoreCase(vlmVersion.getId()))
-        .findAny()
-        .ifPresent(version -> {
-          vlmVersion.setMinor(version.getMinor());
-          vlmVersion.setMajor(version.getMajor());
-        });
-  }
-
-  private PackageInfo createPackageInfo(VspDetails vspDetails) {
-    PackageInfo packageInfo = new PackageInfo(vspDetails.getId(), vspDetails.getVersion());
-    packageInfo.setVspName(vspDetails.getName());
-    packageInfo.setVspDescription(vspDetails.getDescription());
-    packageInfo.setCategory(vspDetails.getCategory());
-    packageInfo.setSubCategory(vspDetails.getSubCategory());
-    packageInfo.setVendorName(vspDetails.getVendorName());
-    packageInfo.setPackageType(VendorSoftwareProductConstants.CSAR);
-    packageInfo.setVendorRelease("1.0"); //todo TBD
-    return packageInfo;
-  }
+    private boolean validateComponentDependencies(Collection<ComponentDependencyModelEntity> componentDependencies) {
+        ComponentDependencyTracker dependencyTracker = new ComponentDependencyTracker();
 
-  @Override
+        for (ComponentDependencyModelEntity componentDependency : componentDependencies) {
+            dependencyTracker.addDependency(componentDependency.getSourceComponentId(),
+                    componentDependency.getTargetComponentId());
+        }
+        return dependencyTracker.isCyclicDependencyPresent();
+    }
+
+    private Collection<ErrorCode> validateDeploymentFlavors(Collection<DeploymentFlavorEntity> deploymentFlavors) {
+
+        Collection<ErrorCode> errorCodeList = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(deploymentFlavors)) {
+            deploymentFlavors.forEach(deploymentFlavor -> {
+                DeploymentFlavorEntity deployment = deploymentFlavorDao.get(deploymentFlavor);
+                DeploymentFlavor deploymentLocalFlavor = deployment.getDeploymentFlavorCompositionData();
+                if (deploymentLocalFlavor != null) {
+                    if (deploymentLocalFlavor.getFeatureGroupId() == null) {
+                        ErrorCode deploymentFlavorErrorBuilder = DeploymentFlavorErrorBuilder.
+                                                                                                     getFeatureGroupMandatoryErrorBuilder(
+                                                                                                             deploymentLocalFlavor
+                                                                                                                     .getModel());
+                        errorCodeList.add(deploymentFlavorErrorBuilder);
+                    }
+                    validateComponentComputeAssociations(errorCodeList, deploymentFlavor, deployment,
+                            deploymentLocalFlavor);
+                }
+            });
+        }
+        return errorCodeList;
+    }
 
-  public QuestionnaireResponse getVspQuestionnaire(String vspId, Version version) {
-    VspQuestionnaireEntity retrieved = vspInfoDao.getQuestionnaire(vspId, version);
-    VersioningUtil.validateEntityExistence(retrieved, new VspQuestionnaireEntity(vspId, version),
-        VspDetails.ENTITY_TYPE);
-
-    String questionnaireData = retrieved.getQuestionnaireData();
-
-    QuestionnaireResponse questionnaireResponse = new QuestionnaireResponse();
-    questionnaireResponse.setData(questionnaireData);
-    questionnaireResponse.setSchema(getVspQuestionnaireSchema(null));
-    return questionnaireResponse;
-  }
-
-  @Override
-  public void updateVspQuestionnaire(String vspId, Version version, String questionnaireData) {
-    vspInfoDao.updateQuestionnaireData(vspId, version, questionnaireData);
-  }
+    private void validateComponentComputeAssociations(Collection<ErrorCode> errorCodeList,
+            DeploymentFlavorEntity deploymentFlavor, DeploymentFlavorEntity deployment,
+            DeploymentFlavor deploymentlocalFlavor) {
+        List<ComponentComputeAssociation> componentComputeAssociations =
+                deploymentlocalFlavor.getComponentComputeAssociations();
+        if (CollectionUtils.isEmpty(componentComputeAssociations)) {
+            validateCompositionEntity(errorCodeList, deploymentFlavor, deployment, deploymentlocalFlavor);
+        } else {
+            componentComputeAssociations.forEach(componentComputeAssociation -> {
+                if (componentComputeAssociation == null || !(componentComputeAssociation.getComponentId() != null
+                                                                     && componentComputeAssociation.getComputeFlavorId()
+                                                                                != null)) {
+                    validateCompositionEntity(errorCodeList, deploymentFlavor, deployment, deploymentlocalFlavor);
+                }
+            });
+        }
+    }
 
+    private void validateCompositionEntity(Collection<ErrorCode> errorCodeList, DeploymentFlavorEntity deploymentFlavor,
+            DeploymentFlavorEntity deployment, DeploymentFlavor deploymentlocalFlavor) {
+        CompositionEntityValidationData compositionEntityValidationData =
+                new CompositionEntityValidationData(CompositionEntityType.deployment, deploymentFlavor.getId());
+        compositionEntityValidationData.setEntityName(deployment.getDeploymentFlavorCompositionData().getModel());
+        ErrorCode deploymentFlavorErrorBuilder = DeploymentFlavorErrorBuilder
+                                                         .getInvalidComponentComputeAssociationErrorBuilder(
+                                                                 deploymentlocalFlavor.getModel());
+        errorCodeList.add(deploymentFlavorErrorBuilder);
+    }
 
-  private Map<String, List<ErrorMessage>> validateOrchestrationTemplate(
-      OrchestrationTemplateEntity orchestrationTemplate) throws IOException {
-
-    if (isOrchestrationTemplateMissing(orchestrationTemplate)) {
-      return null;
-    }
-    Map<String, List<ErrorMessage>> validationErrors = new HashMap<>();
+    private Set<CompositionEntityValidationData> componentValidation(String vspId, Version version) {
+        Set<CompositionEntityValidationData> validationData = new HashSet<>();
+        Collection<ComponentEntity> components = componentDao.list(new ComponentEntity(vspId, version, null));
+        if (!CollectionUtils.isEmpty(components)) {
+            components.forEach(component -> {
+                validateImage(vspId, version, validationData, component);
+                validateNic(vspId, version, validationData, component);
 
-    FileContentHandler fileContentMap = CommonUtil.validateAndUploadFileContent(
-        OnboardingTypesEnum.getOnboardingTypesEnum(orchestrationTemplate.getFileSuffix()),
-        orchestrationTemplate.getContentData().array());
+            });
+        }
 
-    if (CommonUtil.isFileOriginFromZip(orchestrationTemplate.getFileSuffix())) {
-      ValidationManager validationManager =
-          ValidationManagerUtil.initValidationManager(fileContentMap);
-      validationErrors.putAll(validationManager.validate());
+        return validationData;
+    }
+
+    private void validateNic(String vspId, Version version, Set<CompositionEntityValidationData> validationData,
+            ComponentEntity component) {
+        Collection<NicEntity> nics = nicDao.list(new NicEntity(vspId, version, component.getId(), null));
+        if (CollectionUtils.isNotEmpty(nics)) {
+            nics.forEach(nicEntity -> {
+                NicEntity nic = nicDao.get(new NicEntity(vspId, version, component.getId(), nicEntity.getId()));
+                NetworkType networkType = nic.getNicCompositionData().getNetworkType();
+                String networkId = nic.getNicCompositionData().getNetworkId();
+                if (networkType.equals(NetworkType.Internal) && networkId == null) {
+                    CompositionEntityValidationData compositionEntityValidationData =
+                            new CompositionEntityValidationData(CompositionEntityType.nic, nic.getId());
+                    compositionEntityValidationData.setEntityName(nic.getNicCompositionData().getName());
+                    ErrorCode nicInternalNetworkErrorBuilder =
+                            NicInternalNetworkErrorBuilder.getNicNullNetworkIdInternalNetworkIdErrorBuilder();
+                    List<String> errors = new ArrayList<>();
+                    errors.add(nicInternalNetworkErrorBuilder.message());
+                    compositionEntityValidationData.setErrors(errors);
+                    validationData.add(compositionEntityValidationData);
+                }
+            });
+        }
     }
 
-    return
-        MapUtils.isEmpty(MessageContainerUtil.getMessageByLevel(ErrorLevel.ERROR, validationErrors))
-            ? null : validationErrors;
-  }
+    private void validateImage(String vspId, Version version, Set<CompositionEntityValidationData> validationData,
+            ComponentEntity component) {
+        Collection<ImageEntity> images = imageDao.list(new ImageEntity(vspId, version, component.getId(), null));
+        if (CollectionUtils.isEmpty(images)) {
+            CompositionEntityValidationData compositionEntityValidationData =
+                    new CompositionEntityValidationData(component.getType(), component.getId());
+            compositionEntityValidationData.setEntityName(component.getComponentCompositionData().getDisplayName());
+            ErrorCode vfcMissingImageErrorBuilder = ComponentErrorBuilder.vfcMissingImageErrorBuilder();
+            List<String> errors = new ArrayList<>();
+            errors.add(vfcMissingImageErrorBuilder.message());
+            compositionEntityValidationData.setErrors(errors);
+            validationData.add(compositionEntityValidationData);
+        }
+    }
 
-  private QuestionnaireValidationResult validateQuestionnaire(String vspId, Version version,
-                                                              String onboardingMethod) {
-    // The apis of CompositionEntityDataManager used here are stateful!
-    // so, it must be re-created from scratch when it is used!
-    CompositionEntityDataManager compositionEntityDataManager =
-        CompositionEntityDataManagerFactory.getInstance().createInterface();
-    compositionEntityDataManager
-        .addEntity(vspInfoDao.getQuestionnaire(vspId, version), null);
+    private List<ErrorCode> validateVspFields(VspDetails vspDetails) {
+        List<ErrorCode> errors = new ArrayList<>();
 
-    Collection<NicEntity> nics = nicDao.listByVsp(vspId, version);
+        if (vspDetails.getName() == null) {
+            errors.add(createMissingMandatoryFieldError("name"));
+        }
+        if (vspDetails.getDescription() == null) {
+            errors.add(createMissingMandatoryFieldError("description"));
+        }
+        if (vspDetails.getVendorId() == null) {
+            errors.add(createMissingMandatoryFieldError("vendor Id"));
+        }
+        if (vspDetails.getCategory() == null) {
+            errors.add(createMissingMandatoryFieldError("category"));
+        }
+        if (vspDetails.getSubCategory() == null) {
+            errors.add(createMissingMandatoryFieldError("sub category"));
+        }
+        return errors;
+    }
 
-    Map<String, List<String>> nicNamesByComponent = new HashMap<>();
-    for (NicEntity nicEntity : nics) {
-      compositionEntityDataManager.addEntity(nicEntity, null);
-
-      Nic nic = nicEntity.getNicCompositionData();
-      if (nic != null && nic.getName() != null) {
-        List<String> nicNames =
-            nicNamesByComponent.computeIfAbsent(nicEntity.getComponentId(), k -> new ArrayList<>());
-        nicNames.add(nic.getName());
-      }
-    }
-
-    Collection<ComponentEntity> components =
-        componentDao.listCompositionAndQuestionnaire(vspId, version);
-    components.forEach(component -> compositionEntityDataManager.addEntity(component,
-        new ComponentQuestionnaireSchemaInput(nicNamesByComponent.get(component.getId()),
-            JsonUtil.json2Object(component.getQuestionnaireData(), Map.class), null,
-                                                     OnboardingMethod.Manual.name().equals(onboardingMethod))));
-
-    Collection<ComputeEntity> computes = computeDao.listByVsp(vspId, version);
-    computes.forEach(compute -> compositionEntityDataManager.addEntity(compute, null));
-
-    if (OnboardingMethod.Manual.name().equals(onboardingMethod)) {
-      Collection<ImageEntity> images = imageDao.listByVsp(vspId, version);
-      images.forEach(image -> compositionEntityDataManager.addEntity(image, null));
-    }
-
-    Map<CompositionEntityId, Collection<String>> errorsByEntityId =
-        compositionEntityDataManager.validateEntitiesQuestionnaire();
-    if (MapUtils.isNotEmpty(errorsByEntityId)) {
-      compositionEntityDataManager.buildTrees();
-      compositionEntityDataManager.addErrorsToTrees(errorsByEntityId);
-      return new QuestionnaireValidationResult(
-          compositionEntityDataManager.getAllErrorsByVsp(vspId));
-    }
-    return null;
-  }
-
-  @Override
-  public File getInformationArtifact(String vspId, Version version) {
-    VspDetails vspDetails = vspInfoDao.get(new VspDetails(vspId, version));
+    private List<ErrorCode> validateMandatoryLicenseFields(VspDetails vspDetails) {
+        List<ErrorCode> errors = new ArrayList<>();
+        if (vspDetails.getVlmVersion() == null) {
+            errors.add(createMissingMandatoryFieldError("licensing version"));
+        }
+        if (vspDetails.getLicenseAgreement() == null) {
+            errors.add(createMissingMandatoryFieldError("license agreement"));
+        }
+        if (CollectionUtils.isEmpty(vspDetails.getFeatureGroups())) {
+            errors.add(createMissingMandatoryFieldError("feature groups"));
+        }
+        return errors;
+    }
 
-    if (vspDetails == null) {
-      return null;
+    private static ErrorCode createMissingMandatoryFieldError(String fieldName) {
+        return new ValidationErrorBuilder("must be supplied", fieldName).build();
     }
 
-    String vspName = vspDetails.getName();
-    ByteBuffer infoArtifactAsByteBuffer;
-    File infoArtifactFile;
-    try {
-      infoArtifactAsByteBuffer = ByteBuffer.wrap(informationArtifactGenerator.generate(vspId,
-          version).getBytes());
+    private Map<String, List<ErrorMessage>> compile(String vendorSoftwareProductId, Version version,
+            ToscaServiceModel serviceModel) {
+        if (isServiceModelMissing(serviceModel)) {
+            return null;
+        }
+
+        enrichedServiceModelDao.deleteAll(vendorSoftwareProductId, version);
+
+        EnrichmentManager<ToscaServiceModel> enrichmentManager =
+                EnrichmentManagerFactory.getInstance().createInterface();
+        enrichmentManager.init(vendorSoftwareProductId, version);
+        enrichmentManager.setModel(serviceModel);
+        Map<String, List<ErrorMessage>> enrichErrors = enrichmentManager.enrich();
 
-      infoArtifactFile =
-          new File(
-              String.format(VendorSoftwareProductConstants.INFORMATION_ARTIFACT_NAME, vspName));
-      try (OutputStream out = new BufferedOutputStream(new FileOutputStream(infoArtifactFile))) {
-        out.write(infoArtifactAsByteBuffer.array());
-      }
+        enrichedServiceModelDao.storeServiceModel(vendorSoftwareProductId, version, enrichmentManager.getModel());
 
-    } catch (IOException ex) {
-      throw new CoreException(new InformationArtifactCreationErrorBuilder(vspId).build(), ex);
+        return enrichErrors;
     }
-    return infoArtifactFile;
-  }
 
-  String getVspQuestionnaireSchema(SchemaTemplateInput schemaInput) {
-    return SchemaGenerator
-        .generate(SchemaTemplateContext.questionnaire, CompositionEntityType.vsp, schemaInput);
-  }
+    private Collection<ErrorCode> validateLicensingData(VspDetails vspDetails) {
+        if (vspDetails.getVendorId() != null) {
+            Optional<ErrorCode> errorCode =
+                    vendorLicenseFacade.validateVendorForUsage(vspDetails.getVendorId(), vspDetails.getVlmVersion());
+            if (errorCode.isPresent()) {
+                return Collections.singleton(errorCode.get());
+            }
+        }
 
-  @Override
-  public Optional<Pair<String, byte[]>> get(String vspId, Version version) throws IOException {
-
-    OrchestrationTemplateEntity orchestrationTemplateEntity =
-        orchestrationTemplateDao.get(vspId, version);
-
-    if (isOrchestrationTemplateMissing(orchestrationTemplateEntity)) {
-      return Optional.empty();
-    }
-
-    if (CommonUtil.isFileOriginFromZip(orchestrationTemplateEntity.getFileSuffix())) {
-      return Optional.of(new ImmutablePair<>(OnboardingTypesEnum.ZIP.toString(), candidateService
-          .getZipData(orchestrationTemplateEntity.getContentData())));
-    }
-    return Optional.of(new ImmutablePair<>(orchestrationTemplateEntity.getFileSuffix(),
-        orchestrationTemplateEntity.getContentData().array()));
-  }
-
-  void updateUniqueName(String oldVspName, String newVspName) {
-    uniqueValueUtil.updateUniqueValue(
-        VendorSoftwareProductConstants.UniqueValues.VENDOR_SOFTWARE_PRODUCT_NAME,
-        oldVspName, newVspName);
-  }
+        if (vspDetails.getVendorId() == null || vspDetails.getVlmVersion() == null
+                    || vspDetails.getLicenseAgreement() == null || CollectionUtils
+                                                                           .isEmpty(vspDetails.getFeatureGroups())) {
+            return Collections.emptyList();
+        }
+        return vendorLicenseFacade.validateLicensingData(vspDetails.getVendorId(), vspDetails.getVlmVersion(),
+                vspDetails.getLicenseAgreement(), vspDetails.getFeatureGroups());
+    }
 
-  @Override
-  public Collection<ComputeEntity> getComputeByVsp(String vspId, Version version) {
-    return computeDao.listByVsp(vspId, version);
-  }
+    @Override
+    public VspDetails createVsp(VspDetails vspDetails) {
+        vspInfoDao.create(vspDetails);
+        vspInfoDao.updateQuestionnaireData(vspDetails.getId(), vspDetails.getVersion(),
+                new JsonSchemaDataGenerator(getVspQuestionnaireSchema(null)).generateData());
+        return vspDetails;
+    }
 
-  private boolean isOrchestrationTemplateMissing(
-      OrchestrationTemplateEntity orchestrationTemplate) {
-    return orchestrationTemplate == null
-        || orchestrationTemplate.getContentData() == null
-        || orchestrationTemplate.getFileSuffix() == null
-        || orchestrationTemplate.getFileName() == null;
-  }
+    @Override
+    public void updateVsp(VspDetails vspDetails) {
+        VspDetails retrieved = vspInfoDao.get(vspDetails);
+        if (retrieved == null) {
+            throw new CoreException((new ErrorCode.ErrorCodeBuilder().withMessage(
+                    String.format("Vsp with id %s and version %s does not exist.", vspDetails.getId(),
+                            vspDetails.getVersion().getId()))).build());
+        }
+        vspDetails.setOnboardingMethod(retrieved.getOnboardingMethod());
+
+        //If any existing feature group is removed from VSP which is also associated in DF then
+        //update DF to remove feature group associations.
+        updateDeploymentFlavor(vspDetails);
+
+        updateUniqueName(retrieved.getName(), vspDetails.getName());
+        vspInfoDao.update(vspDetails);
+    }
+
+    private void updateDeploymentFlavor(VspDetails vspDetails) {
+        final List<String> featureGroups = vspDetails.getFeatureGroups();
+        if (featureGroups != null) {
+            final Collection<DeploymentFlavorEntity> deploymentFlavorEntities = deploymentFlavorDao
+                                                                                        .list(new DeploymentFlavorEntity(
+                                                                                                vspDetails.getId(),
+                                                                                                vspDetails.getVersion(),
+                                                                                                null));
+            if (Objects.nonNull(deploymentFlavorEntities)) {
+                for (DeploymentFlavorEntity deploymentFlavorEntity : deploymentFlavorEntities) {
+                    updateDeploymentFlavourEntity(featureGroups, deploymentFlavorEntity);
+                }
+            }
+        }
+    }
 
-  private boolean isServiceModelMissing(ToscaServiceModel serviceModel) {
-    return serviceModel == null || serviceModel.getEntryDefinitionServiceTemplate() == null;
-  }
+    private void updateDeploymentFlavourEntity(List<String> featureGroups,
+            DeploymentFlavorEntity deploymentFlavorEntity) {
+        final String featureGroupId = deploymentFlavorEntity.getDeploymentFlavorCompositionData().getFeatureGroupId();
+        if (!featureGroups.contains(featureGroupId)) {
+            DeploymentFlavor deploymentFlavorCompositionData =
+                    deploymentFlavorEntity.getDeploymentFlavorCompositionData();
+            deploymentFlavorCompositionData.setFeatureGroupId(null);
+            deploymentFlavorEntity.setDeploymentFlavorCompositionData(deploymentFlavorCompositionData);
+            deploymentFlavorDao.update(deploymentFlavorEntity);
+        }
+    }
 
-  public static class Builder{
-    private VspMergeDao vspMergeDao;
-    private OrchestrationTemplateDao orchestrationTemplateDao;
-    private OrchestrationTemplateCandidateManager orchestrationTemplateCandidateManager;
-    private VendorSoftwareProductInfoDao vspInfoDao;
-    private VendorLicenseFacade vendorLicenseFacade;
-    private ServiceModelDao<ToscaServiceModel, ServiceElement> serviceModelDao;
-    private EnrichedServiceModelDao<ToscaServiceModel, ServiceElement> enrichedServiceModelDao;
-    private VendorLicenseArtifactsService licenseArtifactsService;
-    private InformationArtifactGenerator informationArtifactGenerator;
-    private PackageInfoDao packageInfoDao;
-    private DeploymentFlavorDao deploymentFlavorDao;
-    private ComponentDao componentDao;
-    private ComponentDependencyModelDao componentDependencyModelDao;
-    private NicDao nicDao;
-    private ComputeDao computeDao;
-    private ImageDao imageDao;
-    private ManualVspToscaManager manualVspToscaManager;
-    private UniqueValueDao uniqueValueDao;
-    private CandidateService candidateService;
 
-    public Builder vspMerge(VspMergeDao vspMergeDao){
-      this.vspMergeDao = vspMergeDao;
-      return this;
+    @Override
+    public VspDetails getVsp(String vspId, Version version) {
+        return getValidatedVsp(vspId, version);
     }
 
-    public Builder orchestrationTemplate(OrchestrationTemplateDao orchestrationTemplateDao) {
-      this.orchestrationTemplateDao = orchestrationTemplateDao;
-      return this;
+    private VspDetails getValidatedVsp(String vspId, Version version) {
+        VspDetails vsp = vspInfoDao.get(new VspDetails(vspId, version));
+        if (vsp == null) {
+            throw new CoreException(new VendorSoftwareProductNotFoundErrorBuilder(vspId).build());
+        }
+        return vsp;
     }
 
-    public Builder orchestrationTemplateCandidateManager(OrchestrationTemplateCandidateManager orchestrationTemplateCandidateManager) {
-      this.orchestrationTemplateCandidateManager = orchestrationTemplateCandidateManager;
-      return this;
+    @Override
+    public void deleteVsp(String vspId, Version version) {
+        vspMergeDao.deleteHint(vspId, version);
     }
 
-    public Builder vspInfo(VendorSoftwareProductInfoDao vspInfoDao) {
-      this.vspInfoDao = vspInfoDao;
-      return this;
+    @Override
+    public List<PackageInfo> listPackages(String category, String subCategory) {
+        return packageInfoDao.listByCategory(category, subCategory);
     }
 
-    public Builder vendorLicenseFacade(VendorLicenseFacade vendorLicenseFacade) {
-      this.vendorLicenseFacade = vendorLicenseFacade;
-      return this;
+    @Override
+    public File getTranslatedFile(String vspId, Version version) {
+        PackageInfo packageInfo = packageInfoDao.get(new PackageInfo(vspId, version));
+        if (packageInfo == null) {
+            throw new CoreException(new PackageNotFoundErrorBuilder(vspId, version).build());
+        }
+
+        ByteBuffer translatedFileBuffer = packageInfo.getTranslatedFile();
+        if (translatedFileBuffer == null) {
+            throw new CoreException(new PackageInvalidErrorBuilder(vspId, version).build());
+        }
+
+        File translatedFile = new File(VendorSoftwareProductConstants.VSP_PACKAGE_ZIP);
+
+        try (FileOutputStream fos = new FileOutputStream(translatedFile)) {
+            fos.write(translatedFileBuffer.array());
+        } catch (IOException exception) {
+            throw new CoreException(new TranslationFileCreationErrorBuilder(vspId, version).build(), exception);
+        }
+        return translatedFile;
     }
 
-    public Builder serviceModel(ServiceModelDao<ToscaServiceModel, ServiceElement> serviceModelDao) {
-      this.serviceModelDao = serviceModelDao;
-      return this;
+    @Override
+    public byte[] getOrchestrationTemplateFile(String vspId, Version version) {
+        OrchestrationTemplateEntity uploadData = orchestrationTemplateDao.get(vspId, version);
+        ByteBuffer contentData = uploadData.getContentData();
+        if (contentData == null) {
+            return new byte[0];
+        }
+
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+        try (final ZipOutputStream zos = new ZipOutputStream(baos);
+             ZipInputStream ignored = new ZipInputStream(new ByteArrayInputStream(contentData.array()))) {
+            zos.write(contentData.array());
+        } catch (IOException exception) {
+            throw new CoreException(new FileCreationErrorBuilder(vspId).build(), exception);
+        }
+        return baos.toByteArray();
     }
 
-    public Builder enrichedServiceModel(EnrichedServiceModelDao<ToscaServiceModel, ServiceElement> enrichedServiceModelDao) {
-      this.enrichedServiceModelDao = enrichedServiceModelDao;
-      return this;
+    @Override
+    public OrchestrationTemplateEntity getOrchestrationTemplateInfo(String vspId, Version version) {
+        return orchestrationTemplateDao.getInfo(vspId, version);
     }
 
-    public Builder licenseArtifactsService(VendorLicenseArtifactsService licenseArtifactsService) {
-      this.licenseArtifactsService = licenseArtifactsService;
-      return this;
+    @Override
+    public Optional<FilesDataStructure> getOrchestrationTemplateStructure(String vspId, Version version) {
+        Optional<String> jsonFileDataStructure =
+                orchestrationTemplateDao.getOrchestrationTemplateStructure(vspId, version);
+
+        if (jsonFileDataStructure.isPresent() && JsonUtil.isValidJson(jsonFileDataStructure.get())) {
+            return Optional.of(JsonUtil.json2Object(jsonFileDataStructure.get(), FilesDataStructure.class));
+        } else {
+            return Optional.empty();
+        }
     }
 
-    public Builder informationArtifactGenerator(InformationArtifactGenerator informationArtifactGenerator) {
-      this.informationArtifactGenerator = informationArtifactGenerator;
-      return this;
+    @Override
+    public PackageInfo createPackage(final String vspId, final Version version) throws IOException {
+        final ToscaServiceModel toscaServiceModel = enrichedServiceModelDao.getServiceModel(vspId, version);
+        final VspDetails vspDetails = vspInfoDao.get(new VspDetails(vspId, version));
+        final Version vlmVersion = vspDetails.getVlmVersion();
+        if (vlmVersion != null) {
+            populateVersionsForVlm(vspDetails.getVendorId(), vlmVersion);
+        }
+        final PackageInfo packageInfo = createPackageInfo(vspDetails);
+
+        final ToscaFileOutputServiceCsarImpl toscaServiceTemplateServiceCsar = new ToscaFileOutputServiceCsarImpl();
+        final FileContentHandler licenseArtifacts = licenseArtifactsService.createLicenseArtifacts(vspDetails.getId(),
+                vspDetails.getVendorId(), vlmVersion, vspDetails.getFeatureGroups());
+        final ETSIService etsiService = new ETSIServiceImpl();
+        if (etsiService.isSol004WithToscaMetaDirectory(toscaServiceModel.getArtifactFiles())) {
+            final FileContentHandler handler = toscaServiceModel.getArtifactFiles();
+            final Manifest manifest = etsiService.getManifest(handler);
+            final Optional<Map<String, Path>> fromToMovedPaths = etsiService.moveNonManoFileToArtifactFolder(handler);
+            fromToMovedPaths.ifPresent(it -> etsiService.updateMainDescriptorPaths(toscaServiceModel, it));
+            packageInfo.setResourceType(etsiService.getResourceType(manifest).name());
+        }
+        packageInfo.setTranslatedFile(
+                ByteBuffer.wrap(toscaServiceTemplateServiceCsar.createOutputFile(toscaServiceModel, licenseArtifacts)));
+
+        packageInfoDao.create(packageInfo);
+        return packageInfo;
     }
 
-    public Builder packageInfo(PackageInfoDao packageInfoDao) {
-      this.packageInfoDao = packageInfoDao;
-      return this;
+    void populateVersionsForVlm(String vlmId, Version vlmVersion) {
+        VersioningManager versioningManager = VersioningManagerFactory.getInstance().createInterface();
+        versioningManager.list(vlmId).stream().filter(version -> version.getId().equalsIgnoreCase(vlmVersion.getId()))
+                .findAny().ifPresent(version -> {
+            vlmVersion.setMinor(version.getMinor());
+            vlmVersion.setMajor(version.getMajor());
+        });
     }
 
-    public Builder deploymentFlavor(DeploymentFlavorDao deploymentFlavorDao) {
-      this.deploymentFlavorDao = deploymentFlavorDao;
-      return this;
+    private PackageInfo createPackageInfo(VspDetails vspDetails) {
+        PackageInfo packageInfo = new PackageInfo(vspDetails.getId(), vspDetails.getVersion());
+        packageInfo.setVspName(vspDetails.getName());
+        packageInfo.setVspDescription(vspDetails.getDescription());
+        packageInfo.setCategory(vspDetails.getCategory());
+        packageInfo.setSubCategory(vspDetails.getSubCategory());
+        packageInfo.setVendorName(vspDetails.getVendorName());
+        packageInfo.setPackageType(VendorSoftwareProductConstants.CSAR);
+        packageInfo.setVendorRelease("1.0"); //todo TBD
+        return packageInfo;
     }
 
-    public Builder component(ComponentDao componentDao) {
-      this.componentDao = componentDao;
-      return this;
+    @Override
+
+    public QuestionnaireResponse getVspQuestionnaire(String vspId, Version version) {
+        VspQuestionnaireEntity retrieved = vspInfoDao.getQuestionnaire(vspId, version);
+        VersioningUtil
+                .validateEntityExistence(retrieved, new VspQuestionnaireEntity(vspId, version), VspDetails.ENTITY_TYPE);
+
+        String questionnaireData = retrieved.getQuestionnaireData();
+
+        QuestionnaireResponse questionnaireResponse = new QuestionnaireResponse();
+        questionnaireResponse.setData(questionnaireData);
+        questionnaireResponse.setSchema(getVspQuestionnaireSchema(null));
+        return questionnaireResponse;
     }
 
-    public Builder componentDependencyModel(ComponentDependencyModelDao componentDependencyModelDao) {
-      this.componentDependencyModelDao = componentDependencyModelDao;
-      return this;
+    @Override
+    public void updateVspQuestionnaire(String vspId, Version version, String questionnaireData) {
+        vspInfoDao.updateQuestionnaireData(vspId, version, questionnaireData);
     }
 
-    public Builder nic(NicDao nicDao) {
-      this.nicDao = nicDao;
-      return this;
+
+    private Map<String, List<ErrorMessage>> validateOrchestrationTemplate(
+            OrchestrationTemplateEntity orchestrationTemplate) throws IOException {
+
+        if (isOrchestrationTemplateMissing(orchestrationTemplate)) {
+            return null;
+        }
+        Map<String, List<ErrorMessage>> validationErrors = new HashMap<>();
+
+        FileContentHandler fileContentMap = CommonUtil.validateAndUploadFileContent(
+                OnboardingTypesEnum.getOnboardingTypesEnum(orchestrationTemplate.getFileSuffix()),
+                orchestrationTemplate.getContentData().array());
+
+        if (CommonUtil.isFileOriginFromZip(orchestrationTemplate.getFileSuffix())) {
+            ValidationManager validationManager = ValidationManagerUtil.initValidationManager(fileContentMap);
+            validationErrors.putAll(validationManager.validate());
+        }
+
+        return MapUtils.isEmpty(MessageContainerUtil.getMessageByLevel(ErrorLevel.ERROR, validationErrors)) ? null
+                       : validationErrors;
+    }
+
+    private QuestionnaireValidationResult validateQuestionnaire(String vspId, Version version,
+            String onboardingMethod) {
+        // The apis of CompositionEntityDataManager used here are stateful!
+        // so, it must be re-created from scratch when it is used!
+        CompositionEntityDataManager compositionEntityDataManager =
+                CompositionEntityDataManagerFactory.getInstance().createInterface();
+        compositionEntityDataManager.addEntity(vspInfoDao.getQuestionnaire(vspId, version), null);
+
+        Collection<NicEntity> nics = nicDao.listByVsp(vspId, version);
+
+        Map<String, List<String>> nicNamesByComponent = new HashMap<>();
+        for (NicEntity nicEntity : nics) {
+            compositionEntityDataManager.addEntity(nicEntity, null);
+
+            Nic nic = nicEntity.getNicCompositionData();
+            if (nic != null && nic.getName() != null) {
+                List<String> nicNames =
+                        nicNamesByComponent.computeIfAbsent(nicEntity.getComponentId(), k -> new ArrayList<>());
+                nicNames.add(nic.getName());
+            }
+        }
+
+        Collection<ComponentEntity> components = componentDao.listCompositionAndQuestionnaire(vspId, version);
+        components.forEach(component -> compositionEntityDataManager.addEntity(component,
+                new ComponentQuestionnaireSchemaInput(nicNamesByComponent.get(component.getId()),
+                        JsonUtil.json2Object(component.getQuestionnaireData(), Map.class), null,
+                        OnboardingMethod.Manual.name().equals(onboardingMethod))));
+
+        Collection<ComputeEntity> computes = computeDao.listByVsp(vspId, version);
+        computes.forEach(compute -> compositionEntityDataManager.addEntity(compute, null));
+
+        if (OnboardingMethod.Manual.name().equals(onboardingMethod)) {
+            Collection<ImageEntity> images = imageDao.listByVsp(vspId, version);
+            images.forEach(image -> compositionEntityDataManager.addEntity(image, null));
+        }
+
+        Map<CompositionEntityId, Collection<String>> errorsByEntityId =
+                compositionEntityDataManager.validateEntitiesQuestionnaire();
+        if (MapUtils.isNotEmpty(errorsByEntityId)) {
+            compositionEntityDataManager.buildTrees();
+            compositionEntityDataManager.addErrorsToTrees(errorsByEntityId);
+            return new QuestionnaireValidationResult(compositionEntityDataManager.getAllErrorsByVsp(vspId));
+        }
+        return null;
     }
 
-    public Builder compute(ComputeDao computeDao) {
-      this.computeDao = computeDao;
-      return this;
+    @Override
+    public File getInformationArtifact(String vspId, Version version) {
+        VspDetails vspDetails = vspInfoDao.get(new VspDetails(vspId, version));
+
+        if (vspDetails == null) {
+            return null;
+        }
+
+        String vspName = vspDetails.getName();
+        ByteBuffer infoArtifactAsByteBuffer;
+        File infoArtifactFile;
+        try {
+            infoArtifactAsByteBuffer =
+                    ByteBuffer.wrap(informationArtifactGenerator.generate(vspId, version).getBytes());
+
+            infoArtifactFile =
+                    new File(String.format(VendorSoftwareProductConstants.INFORMATION_ARTIFACT_NAME, vspName));
+            try (OutputStream out = new BufferedOutputStream(new FileOutputStream(infoArtifactFile))) {
+                out.write(infoArtifactAsByteBuffer.array());
+            }
+
+        } catch (IOException ex) {
+            throw new CoreException(new InformationArtifactCreationErrorBuilder(vspId).build(), ex);
+        }
+        return infoArtifactFile;
     }
 
-    public Builder image(ImageDao imageDao) {
-      this.imageDao = imageDao;
-      return this;
+    String getVspQuestionnaireSchema(SchemaTemplateInput schemaInput) {
+        return SchemaGenerator.generate(SchemaTemplateContext.questionnaire, CompositionEntityType.vsp, schemaInput);
+    }
+
+    @Override
+    public Optional<Pair<String, byte[]>> get(String vspId, Version version) throws IOException {
+
+        OrchestrationTemplateEntity orchestrationTemplateEntity = orchestrationTemplateDao.get(vspId, version);
+
+        if (isOrchestrationTemplateMissing(orchestrationTemplateEntity)) {
+            return Optional.empty();
+        }
+
+        if (CommonUtil.isFileOriginFromZip(orchestrationTemplateEntity.getFileSuffix())) {
+            return Optional.of(new ImmutablePair<>(OnboardingTypesEnum.ZIP.toString(),
+                    candidateService.getZipData(orchestrationTemplateEntity.getContentData())));
+        }
+        return Optional.of(new ImmutablePair<>(orchestrationTemplateEntity.getFileSuffix(),
+                orchestrationTemplateEntity.getContentData().array()));
     }
 
-    public Builder manualVspToscaManager(ManualVspToscaManager manualVspToscaManager) {
-      this.manualVspToscaManager = manualVspToscaManager;
-      return this;
+    void updateUniqueName(String oldVspName, String newVspName) {
+        uniqueValueUtil
+                .updateUniqueValue(VendorSoftwareProductConstants.UniqueValues.VENDOR_SOFTWARE_PRODUCT_NAME, oldVspName,
+                        newVspName);
     }
 
-    public Builder uniqueValue(UniqueValueDao uniqueValueDao) {
-      this.uniqueValueDao = uniqueValueDao;
-      return this;
+    @Override
+    public Collection<ComputeEntity> getComputeByVsp(String vspId, Version version) {
+        return computeDao.listByVsp(vspId, version);
     }
 
-    public Builder candidateService(CandidateService candidateService) {
-      this.candidateService = candidateService;
-      return this;
+    private boolean isOrchestrationTemplateMissing(OrchestrationTemplateEntity orchestrationTemplate) {
+        return orchestrationTemplate == null || orchestrationTemplate.getContentData() == null
+                       || orchestrationTemplate.getFileSuffix() == null || orchestrationTemplate.getFileName() == null;
     }
 
-    private void registerToVersioning() {
-      if(serviceModelDao != null) {
-        serviceModelDao.registerVersioning(
-                VendorSoftwareProductConstants.VENDOR_SOFTWARE_PRODUCT_VERSIONABLE_TYPE);
-      }
-      if(enrichedServiceModelDao != null) {
-        enrichedServiceModelDao.registerVersioning(
-                VendorSoftwareProductConstants.VENDOR_SOFTWARE_PRODUCT_VERSIONABLE_TYPE);
-      }
+    private boolean isServiceModelMissing(ToscaServiceModel serviceModel) {
+        return serviceModel == null || serviceModel.getEntryDefinitionServiceTemplate() == null;
     }
 
-    public VendorSoftwareProductManager build(){
-      VendorSoftwareProductManagerImpl vendorSoftwareProductManager = new VendorSoftwareProductManagerImpl();
-      vendorSoftwareProductManager.vspMergeDao = this.vspMergeDao;
-      vendorSoftwareProductManager.orchestrationTemplateDao = this.orchestrationTemplateDao;
-      vendorSoftwareProductManager.orchestrationTemplateCandidateManager = this.orchestrationTemplateCandidateManager;
-      vendorSoftwareProductManager.vspInfoDao = this.vspInfoDao;
-      vendorSoftwareProductManager.vendorLicenseFacade = this.vendorLicenseFacade;
-      vendorSoftwareProductManager.serviceModelDao = this.serviceModelDao;
-      vendorSoftwareProductManager.enrichedServiceModelDao = this.enrichedServiceModelDao;
-      vendorSoftwareProductManager.licenseArtifactsService = this.licenseArtifactsService;
-      vendorSoftwareProductManager.informationArtifactGenerator = this.informationArtifactGenerator;
-      vendorSoftwareProductManager.packageInfoDao = this.packageInfoDao;
-      vendorSoftwareProductManager.deploymentFlavorDao = this.deploymentFlavorDao;
-      vendorSoftwareProductManager.componentDao = this.componentDao;
-      vendorSoftwareProductManager.componentDependencyModelDao = this.componentDependencyModelDao;
-      vendorSoftwareProductManager.nicDao = this.nicDao;
-      vendorSoftwareProductManager.computeDao = this.computeDao;
-      vendorSoftwareProductManager.imageDao = this.imageDao;
-      vendorSoftwareProductManager.manualVspToscaManager = this.manualVspToscaManager;
-      vendorSoftwareProductManager.uniqueValueUtil = new UniqueValueUtil(this.uniqueValueDao);
-      vendorSoftwareProductManager.candidateService = candidateService;
-      this.registerToVersioning();
-      return vendorSoftwareProductManager;
+    public static class Builder {
+
+        private VspMergeDao vspMergeDao;
+        private OrchestrationTemplateDao orchestrationTemplateDao;
+        private OrchestrationTemplateCandidateManager orchestrationTemplateCandidateManager;
+        private VendorSoftwareProductInfoDao vspInfoDao;
+        private VendorLicenseFacade vendorLicenseFacade;
+        private ServiceModelDao<ToscaServiceModel, ServiceElement> serviceModelDao;
+        private EnrichedServiceModelDao<ToscaServiceModel, ServiceElement> enrichedServiceModelDao;
+        private VendorLicenseArtifactsService licenseArtifactsService;
+        private InformationArtifactGenerator informationArtifactGenerator;
+        private PackageInfoDao packageInfoDao;
+        private DeploymentFlavorDao deploymentFlavorDao;
+        private ComponentDao componentDao;
+        private ComponentDependencyModelDao componentDependencyModelDao;
+        private NicDao nicDao;
+        private ComputeDao computeDao;
+        private ImageDao imageDao;
+        private ManualVspToscaManager manualVspToscaManager;
+        private UniqueValueDao uniqueValueDao;
+        private CandidateService candidateService;
+
+        public Builder vspMerge(VspMergeDao vspMergeDao) {
+            this.vspMergeDao = vspMergeDao;
+            return this;
+        }
+
+        public Builder orchestrationTemplate(OrchestrationTemplateDao orchestrationTemplateDao) {
+            this.orchestrationTemplateDao = orchestrationTemplateDao;
+            return this;
+        }
+
+        public Builder orchestrationTemplateCandidateManager(
+                OrchestrationTemplateCandidateManager orchestrationTemplateCandidateManager) {
+            this.orchestrationTemplateCandidateManager = orchestrationTemplateCandidateManager;
+            return this;
+        }
+
+        public Builder vspInfo(VendorSoftwareProductInfoDao vspInfoDao) {
+            this.vspInfoDao = vspInfoDao;
+            return this;
+        }
+
+        public Builder vendorLicenseFacade(VendorLicenseFacade vendorLicenseFacade) {
+            this.vendorLicenseFacade = vendorLicenseFacade;
+            return this;
+        }
+
+        public Builder serviceModel(ServiceModelDao<ToscaServiceModel, ServiceElement> serviceModelDao) {
+            this.serviceModelDao = serviceModelDao;
+            return this;
+        }
+
+        public Builder enrichedServiceModel(
+                EnrichedServiceModelDao<ToscaServiceModel, ServiceElement> enrichedServiceModelDao) {
+            this.enrichedServiceModelDao = enrichedServiceModelDao;
+            return this;
+        }
+
+        public Builder licenseArtifactsService(VendorLicenseArtifactsService licenseArtifactsService) {
+            this.licenseArtifactsService = licenseArtifactsService;
+            return this;
+        }
+
+        public Builder informationArtifactGenerator(InformationArtifactGenerator informationArtifactGenerator) {
+            this.informationArtifactGenerator = informationArtifactGenerator;
+            return this;
+        }
+
+        public Builder packageInfo(PackageInfoDao packageInfoDao) {
+            this.packageInfoDao = packageInfoDao;
+            return this;
+        }
+
+        public Builder deploymentFlavor(DeploymentFlavorDao deploymentFlavorDao) {
+            this.deploymentFlavorDao = deploymentFlavorDao;
+            return this;
+        }
+
+        public Builder component(ComponentDao componentDao) {
+            this.componentDao = componentDao;
+            return this;
+        }
+
+        public Builder componentDependencyModel(ComponentDependencyModelDao componentDependencyModelDao) {
+            this.componentDependencyModelDao = componentDependencyModelDao;
+            return this;
+        }
+
+        public Builder nic(NicDao nicDao) {
+            this.nicDao = nicDao;
+            return this;
+        }
+
+        public Builder compute(ComputeDao computeDao) {
+            this.computeDao = computeDao;
+            return this;
+        }
+
+        public Builder image(ImageDao imageDao) {
+            this.imageDao = imageDao;
+            return this;
+        }
+
+        public Builder manualVspToscaManager(ManualVspToscaManager manualVspToscaManager) {
+            this.manualVspToscaManager = manualVspToscaManager;
+            return this;
+        }
+
+        public Builder uniqueValue(UniqueValueDao uniqueValueDao) {
+            this.uniqueValueDao = uniqueValueDao;
+            return this;
+        }
+
+        public Builder candidateService(CandidateService candidateService) {
+            this.candidateService = candidateService;
+            return this;
+        }
+
+        private void registerToVersioning() {
+            if (serviceModelDao != null) {
+                serviceModelDao
+                        .registerVersioning(VendorSoftwareProductConstants.VENDOR_SOFTWARE_PRODUCT_VERSIONABLE_TYPE);
+            }
+            if (enrichedServiceModelDao != null) {
+                enrichedServiceModelDao
+                        .registerVersioning(VendorSoftwareProductConstants.VENDOR_SOFTWARE_PRODUCT_VERSIONABLE_TYPE);
+            }
+        }
+
+        public VendorSoftwareProductManager build() {
+            VendorSoftwareProductManagerImpl vendorSoftwareProductManager = new VendorSoftwareProductManagerImpl();
+            vendorSoftwareProductManager.vspMergeDao = this.vspMergeDao;
+            vendorSoftwareProductManager.orchestrationTemplateDao = this.orchestrationTemplateDao;
+            vendorSoftwareProductManager.orchestrationTemplateCandidateManager =
+                    this.orchestrationTemplateCandidateManager;
+            vendorSoftwareProductManager.vspInfoDao = this.vspInfoDao;
+            vendorSoftwareProductManager.vendorLicenseFacade = this.vendorLicenseFacade;
+            vendorSoftwareProductManager.serviceModelDao = this.serviceModelDao;
+            vendorSoftwareProductManager.enrichedServiceModelDao = this.enrichedServiceModelDao;
+            vendorSoftwareProductManager.licenseArtifactsService = this.licenseArtifactsService;
+            vendorSoftwareProductManager.informationArtifactGenerator = this.informationArtifactGenerator;
+            vendorSoftwareProductManager.packageInfoDao = this.packageInfoDao;
+            vendorSoftwareProductManager.deploymentFlavorDao = this.deploymentFlavorDao;
+            vendorSoftwareProductManager.componentDao = this.componentDao;
+            vendorSoftwareProductManager.componentDependencyModelDao = this.componentDependencyModelDao;
+            vendorSoftwareProductManager.nicDao = this.nicDao;
+            vendorSoftwareProductManager.computeDao = this.computeDao;
+            vendorSoftwareProductManager.imageDao = this.imageDao;
+            vendorSoftwareProductManager.manualVspToscaManager = this.manualVspToscaManager;
+            vendorSoftwareProductManager.uniqueValueUtil = new UniqueValueUtil(this.uniqueValueDao);
+            vendorSoftwareProductManager.candidateService = candidateService;
+            this.registerToVersioning();
+            return vendorSoftwareProductManager;
+        }
     }
-  }
 
 }