5d2fd518fa39902b959f983e837e062a9085f1ba
[sdc.git] /
1 /*
2  * Copyright © 2016-2018 European Support Limited
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package org.openecomp.sdc.vendorsoftwareproduct.impl;
18
19 import org.apache.commons.collections4.CollectionUtils;
20 import org.apache.commons.collections4.MapUtils;
21 import org.apache.commons.lang3.tuple.ImmutablePair;
22 import org.apache.commons.lang3.tuple.Pair;
23 import org.openecomp.core.dao.UniqueValueDao;
24 import org.openecomp.core.enrichment.api.EnrichmentManager;
25 import org.openecomp.core.enrichment.factory.EnrichmentManagerFactory;
26 import org.openecomp.core.model.dao.EnrichedServiceModelDao;
27 import org.openecomp.core.model.dao.ServiceModelDao;
28 import org.openecomp.core.model.types.ServiceElement;
29 import org.openecomp.core.util.UniqueValueUtil;
30 import org.openecomp.core.utilities.file.FileContentHandler;
31 import org.openecomp.core.utilities.json.JsonSchemaDataGenerator;
32 import org.openecomp.core.utilities.json.JsonUtil;
33 import org.openecomp.core.utilities.orchestration.OnboardingTypesEnum;
34 import org.openecomp.core.validation.api.ValidationManager;
35 import org.openecomp.core.validation.util.MessageContainerUtil;
36 import org.openecomp.sdc.common.errors.CoreException;
37 import org.openecomp.sdc.common.errors.ErrorCode;
38 import org.openecomp.sdc.common.errors.ValidationErrorBuilder;
39 import org.openecomp.sdc.common.utils.CommonUtil;
40 import org.openecomp.sdc.datatypes.error.ErrorLevel;
41 import org.openecomp.sdc.datatypes.error.ErrorMessage;
42 import org.openecomp.sdc.tosca.csar.Manifest;
43 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
44 import org.openecomp.sdc.tosca.services.impl.ToscaFileOutputServiceCsarImpl;
45 import org.openecomp.sdc.validation.util.ValidationManagerUtil;
46 import org.openecomp.sdc.vendorlicense.facade.VendorLicenseFacade;
47 import org.openecomp.sdc.vendorlicense.licenseartifacts.VendorLicenseArtifactsService;
48 import org.openecomp.sdc.vendorsoftwareproduct.CompositionEntityDataManager;
49 import org.openecomp.sdc.vendorsoftwareproduct.CompositionEntityDataManagerFactory;
50 import org.openecomp.sdc.vendorsoftwareproduct.ManualVspToscaManager;
51 import org.openecomp.sdc.vendorsoftwareproduct.OrchestrationTemplateCandidateManager;
52 import org.openecomp.sdc.vendorsoftwareproduct.VendorSoftwareProductConstants;
53 import org.openecomp.sdc.vendorsoftwareproduct.VendorSoftwareProductManager;
54 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDao;
55 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDependencyModelDao;
56 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComputeDao;
57 import org.openecomp.sdc.vendorsoftwareproduct.dao.DeploymentFlavorDao;
58 import org.openecomp.sdc.vendorsoftwareproduct.dao.ImageDao;
59 import org.openecomp.sdc.vendorsoftwareproduct.dao.NicDao;
60 import org.openecomp.sdc.vendorsoftwareproduct.dao.OrchestrationTemplateDao;
61 import org.openecomp.sdc.vendorsoftwareproduct.dao.PackageInfoDao;
62 import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductInfoDao;
63 import org.openecomp.sdc.vendorsoftwareproduct.dao.VspMergeDao;
64 import org.openecomp.sdc.vendorsoftwareproduct.dao.errors.VendorSoftwareProductNotFoundErrorBuilder;
65 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentDependencyModelEntity;
66 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentEntity;
67 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComputeEntity;
68 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.DeploymentFlavorEntity;
69 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ImageEntity;
70 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.NicEntity;
71 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.OnboardingMethod;
72 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.OrchestrationTemplateEntity;
73 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.PackageInfo;
74 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
75 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspQuestionnaireEntity;
76 import org.openecomp.sdc.vendorsoftwareproduct.errors.ComponentDependencyModelErrorBuilder;
77 import org.openecomp.sdc.vendorsoftwareproduct.errors.ComponentErrorBuilder;
78 import org.openecomp.sdc.vendorsoftwareproduct.errors.DeploymentFlavorErrorBuilder;
79 import org.openecomp.sdc.vendorsoftwareproduct.errors.FileCreationErrorBuilder;
80 import org.openecomp.sdc.vendorsoftwareproduct.errors.InformationArtifactCreationErrorBuilder;
81 import org.openecomp.sdc.vendorsoftwareproduct.errors.NicInternalNetworkErrorBuilder;
82 import org.openecomp.sdc.vendorsoftwareproduct.errors.PackageInvalidErrorBuilder;
83 import org.openecomp.sdc.vendorsoftwareproduct.errors.PackageNotFoundErrorBuilder;
84 import org.openecomp.sdc.vendorsoftwareproduct.errors.TranslationFileCreationErrorBuilder;
85 import org.openecomp.sdc.vendorsoftwareproduct.errors.VendorSoftwareProductInvalidErrorBuilder;
86 import org.openecomp.sdc.vendorsoftwareproduct.informationArtifact.InformationArtifactGenerator;
87 import org.openecomp.sdc.vendorsoftwareproduct.services.filedatastructuremodule.CandidateService;
88 import org.openecomp.sdc.vendorsoftwareproduct.services.impl.etsi.ETSIService;
89 import org.openecomp.sdc.vendorsoftwareproduct.services.impl.etsi.ETSIServiceImpl;
90 import org.openecomp.sdc.vendorsoftwareproduct.services.schemagenerator.SchemaGenerator;
91 import org.openecomp.sdc.vendorsoftwareproduct.types.QuestionnaireResponse;
92 import org.openecomp.sdc.vendorsoftwareproduct.types.QuestionnaireValidationResult;
93 import org.openecomp.sdc.vendorsoftwareproduct.types.ValidationResponse;
94 import org.openecomp.sdc.vendorsoftwareproduct.types.candidateheat.FilesDataStructure;
95 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.ComponentComputeAssociation;
96 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityId;
97 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityType;
98 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionEntityValidationData;
99 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.DeploymentFlavor;
100 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.NetworkType;
101 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.Nic;
102 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.ComponentQuestionnaireSchemaInput;
103 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateContext;
104 import org.openecomp.sdc.vendorsoftwareproduct.types.schemagenerator.SchemaTemplateInput;
105 import org.openecomp.sdc.vendorsoftwareproduct.utils.ComponentDependencyTracker;
106 import org.openecomp.sdc.versioning.VersioningManager;
107 import org.openecomp.sdc.versioning.VersioningManagerFactory;
108 import org.openecomp.sdc.versioning.VersioningUtil;
109 import org.openecomp.sdc.versioning.dao.types.Version;
110
111 import java.io.BufferedOutputStream;
112 import java.io.ByteArrayInputStream;
113 import java.io.ByteArrayOutputStream;
114 import java.io.File;
115 import java.io.FileOutputStream;
116 import java.io.IOException;
117 import java.io.OutputStream;
118 import java.nio.ByteBuffer;
119 import java.util.ArrayList;
120 import java.util.Collection;
121 import java.util.Collections;
122 import java.util.HashMap;
123 import java.util.HashSet;
124 import java.util.List;
125 import java.util.Map;
126 import java.util.Objects;
127 import java.util.Optional;
128 import java.util.Set;
129 import java.util.zip.ZipInputStream;
130 import java.util.zip.ZipOutputStream;
131
132 import static org.openecomp.sdc.vendorsoftwareproduct.errors.VendorSoftwareProductInvalidErrorBuilder.candidateDataNotProcessedOrAbortedErrorBuilder;
133 import static org.openecomp.sdc.vendorsoftwareproduct.errors.VendorSoftwareProductInvalidErrorBuilder.invalidProcessedCandidate;
134 import static org.openecomp.sdc.vendorsoftwareproduct.errors.VendorSoftwareProductInvalidErrorBuilder.vspMissingDeploymentFlavorErrorBuilder;
135
136 public class VendorSoftwareProductManagerImpl implements VendorSoftwareProductManager {
137
138   private VspMergeDao vspMergeDao;
139   private OrchestrationTemplateDao orchestrationTemplateDao;
140   private OrchestrationTemplateCandidateManager orchestrationTemplateCandidateManager;
141   private VendorSoftwareProductInfoDao vspInfoDao;
142   private VendorLicenseFacade vendorLicenseFacade;
143   private ServiceModelDao<ToscaServiceModel, ServiceElement> serviceModelDao;
144   private EnrichedServiceModelDao<ToscaServiceModel, ServiceElement> enrichedServiceModelDao;
145   private VendorLicenseArtifactsService licenseArtifactsService;
146   private InformationArtifactGenerator informationArtifactGenerator;
147   private PackageInfoDao packageInfoDao;
148   private DeploymentFlavorDao deploymentFlavorDao;
149   private ComponentDao componentDao;
150   private ComponentDependencyModelDao componentDependencyModelDao;
151   private NicDao nicDao;
152   private ComputeDao computeDao;
153   private ImageDao imageDao;
154   private ManualVspToscaManager manualVspToscaManager;
155   private UniqueValueUtil uniqueValueUtil;
156   private CandidateService candidateService;
157
158   @Override
159   public ValidationResponse validate(VspDetails vspDetails) throws IOException {
160     List<ErrorCode> vspErrors = new ArrayList<>(validateVspFields(vspDetails));
161     ValidationResponse validationResponse = new ValidationResponse();
162     if (Objects.nonNull(vspDetails.getOnboardingMethod())
163         && OnboardingMethod.Manual.name().equals(vspDetails.getOnboardingMethod())) {
164       validateManualOnboardingMethod(vspDetails, validationResponse, vspErrors);
165     } else {
166       validateOrchestrationTemplateCandidate(validationResponse, vspErrors, vspDetails.getId(), vspDetails.getVersion());
167       if (!validationResponse.isValid()) {
168         return validationResponse;
169       }
170       validateLicense(vspDetails, vspErrors);
171       OrchestrationTemplateEntity orchestrationTemplate =
172           orchestrationTemplateDao.get(vspDetails.getId(), vspDetails.getVersion());
173       ToscaServiceModel serviceModel =
174           serviceModelDao.getServiceModel( vspDetails.getId(), vspDetails.getVersion());
175       if (isOrchestrationTemplateMissing(orchestrationTemplate)
176           || isServiceModelMissing(serviceModel)) {
177         vspErrors.add(VendorSoftwareProductInvalidErrorBuilder
178             .vendorSoftwareProductMissingServiceModelErrorBuilder(vspDetails.getId(),
179                 vspDetails.getVersion()));
180       }
181       validationResponse.setUploadDataErrors(validateOrchestrationTemplate(orchestrationTemplate));
182     }
183
184     QuestionnaireValidationResult questionnaireValidationResult = validateQuestionnaire
185         (vspDetails.getId(), vspDetails.getVersion(), vspDetails.getOnboardingMethod());
186
187     if (Objects.nonNull(questionnaireValidationResult)) {
188       if (validationResponse.getQuestionnaireValidationResult() == null || validationResponse
189           .getQuestionnaireValidationResult().getValidationData() == null) {
190         validationResponse.setQuestionnaireValidationResult(questionnaireValidationResult);
191       } else {
192         validationResponse.getQuestionnaireValidationResult().getValidationData().addAll
193             (questionnaireValidationResult.getValidationData());
194       }
195     }
196
197     Collection<ComponentDependencyModelEntity> componentDependencies =
198         componentDependencyModelDao.list(new ComponentDependencyModelEntity(vspDetails.getId(), vspDetails.getVersion(), null));
199
200     if (validateComponentDependencies(componentDependencies)) {
201       vspErrors
202           .add(ComponentDependencyModelErrorBuilder.getCyclicDependencyComponentErrorBuilder());
203     }
204     validationResponse
205         .setVspErrors(vspErrors);
206     validationResponse.setLicensingDataErrors(validateLicensingData(vspDetails));
207     return validationResponse;
208   }
209
210   private void validateLicense(VspDetails vspDetails, List<ErrorCode> vspErrors) {
211     if (vspDetails.getVlmVersion() != null || vspDetails.getLicenseAgreement() != null
212             || vspDetails.getFeatureGroups() != null) {
213       vspErrors.addAll(validateMandatoryLicenseFields(vspDetails));
214     }
215   }
216
217   private void validateOrchestrationTemplateCandidate(ValidationResponse validationResponse,
218                                                       List<ErrorCode> vspErrors, String vspId,
219                                                       Version version) {
220     orchestrationTemplateCandidateManager.getInfo(vspId, version)
221         .ifPresent(candidateInfo -> {
222           String fileName = candidateInfo.getFileName();
223           vspErrors.add(candidateInfo.getValidationData().isEmpty()
224               ? candidateDataNotProcessedOrAbortedErrorBuilder(fileName)
225               : invalidProcessedCandidate(fileName));
226           validationResponse.setVspErrors(vspErrors);
227         });
228   }
229
230   private void validateManualOnboardingMethod(VspDetails vspDetails,
231                                               ValidationResponse validationResponse,
232                                               List<ErrorCode> vspErrors) {
233     vspErrors.addAll(validateMandatoryLicenseFields(vspDetails));
234
235     Collection<DeploymentFlavorEntity> deploymentFlavors = deploymentFlavorDao
236         .list(new DeploymentFlavorEntity(vspDetails.getId(), vspDetails.getVersion(), null));
237     if (CollectionUtils.isEmpty(deploymentFlavors)) {
238       vspErrors.add(vspMissingDeploymentFlavorErrorBuilder());
239     }
240     vspErrors.addAll(validateDeploymentFlavors(deploymentFlavors));
241
242     Set<CompositionEntityValidationData> componentValidationResult =
243         componentValidation(vspDetails.getId(), vspDetails.getVersion());
244     if (!CollectionUtils.isEmpty(componentValidationResult)) {
245       if (validationResponse.getQuestionnaireValidationResult() == null
246           || validationResponse.getQuestionnaireValidationResult().getValidationData() == null) {
247         validationResponse.setQuestionnaireValidationResult(
248             new QuestionnaireValidationResult(componentValidationResult));
249       } else {
250         validationResponse.getQuestionnaireValidationResult().getValidationData()
251             .addAll(componentValidationResult);
252       }
253     }
254   }
255
256   @Override
257   public Map<String, List<ErrorMessage>> compile(String vspId, Version version) {
258     ToscaServiceModel serviceModel =
259         OnboardingMethod.Manual.name().equals(getValidatedVsp(vspId, version).getOnboardingMethod())
260             //Generate Tosca service model for Manual Onboarding flow
261             ? manualVspToscaManager
262             .generateToscaModel(manualVspToscaManager.gatherVspInformation(vspId, version))
263             : serviceModelDao.getServiceModel(vspId, version);
264
265     return compile(vspId, version, serviceModel);
266   }
267
268   private boolean validateComponentDependencies(
269       Collection<ComponentDependencyModelEntity> componentDependencies) {
270     ComponentDependencyTracker dependencyTracker = new ComponentDependencyTracker();
271
272     for (ComponentDependencyModelEntity componentDependency : componentDependencies) {
273       dependencyTracker.addDependency(componentDependency.getSourceComponentId(),
274           componentDependency.getTargetComponentId());
275     }
276     return dependencyTracker.isCyclicDependencyPresent();
277   }
278
279   private Collection<ErrorCode> validateDeploymentFlavors(
280       Collection<DeploymentFlavorEntity> deploymentFlavors) {
281
282     Collection<ErrorCode> errorCodeList = new ArrayList<>();
283     if (!CollectionUtils.isEmpty(deploymentFlavors)) {
284       deploymentFlavors.forEach(deploymentFlavor -> {
285         DeploymentFlavorEntity deployment = deploymentFlavorDao.get(deploymentFlavor);
286         DeploymentFlavor deploymentLocalFlavor = deployment.getDeploymentFlavorCompositionData();
287         if (deploymentLocalFlavor != null) {
288           if (deploymentLocalFlavor.getFeatureGroupId() == null) {
289             ErrorCode deploymentFlavorErrorBuilder = DeploymentFlavorErrorBuilder.
290                 getFeatureGroupMandatoryErrorBuilder(deploymentLocalFlavor.getModel());
291             errorCodeList.add(deploymentFlavorErrorBuilder);
292           }
293           validateComponentComputeAssociations(errorCodeList, deploymentFlavor,
294               deployment, deploymentLocalFlavor);
295         }
296       });
297     }
298     return errorCodeList;
299   }
300
301   private void validateComponentComputeAssociations(Collection<ErrorCode> errorCodeList,
302                                                     DeploymentFlavorEntity deploymentFlavor,
303                                                     DeploymentFlavorEntity deployment,
304                                                     DeploymentFlavor deploymentlocalFlavor) {
305     List<ComponentComputeAssociation> componentComputeAssociations =
306         deploymentlocalFlavor.getComponentComputeAssociations();
307     if (CollectionUtils.isEmpty(componentComputeAssociations)) {
308         validateCompositionEntity(errorCodeList, deploymentFlavor, deployment, deploymentlocalFlavor);
309     } else {
310       componentComputeAssociations.forEach(componentComputeAssociation -> {
311         if (componentComputeAssociation == null
312             || !(componentComputeAssociation.getComponentId() != null
313             && componentComputeAssociation.getComputeFlavorId() != null)) {
314             validateCompositionEntity(errorCodeList, deploymentFlavor, deployment, deploymentlocalFlavor);
315         }
316       });
317     }
318   }
319
320   private void validateCompositionEntity(Collection<ErrorCode> errorCodeList,
321                                                                              DeploymentFlavorEntity deploymentFlavor,
322                                                                              DeploymentFlavorEntity deployment,
323                                                                              DeploymentFlavor deploymentlocalFlavor){
324     CompositionEntityValidationData compositionEntityValidationData = new
325             CompositionEntityValidationData(CompositionEntityType.deployment, deploymentFlavor
326             .getId());
327     compositionEntityValidationData.setEntityName(deployment
328             .getDeploymentFlavorCompositionData().getModel());
329     ErrorCode deploymentFlavorErrorBuilder = DeploymentFlavorErrorBuilder
330             .getInvalidComponentComputeAssociationErrorBuilder(
331                     deploymentlocalFlavor.getModel());
332     errorCodeList.add(deploymentFlavorErrorBuilder);
333   }
334
335   private Set<CompositionEntityValidationData> componentValidation(String vspId, Version version) {
336     Set<CompositionEntityValidationData> validationData = new HashSet<>();
337     Collection<ComponentEntity> components =
338         componentDao.list(new ComponentEntity(vspId, version, null));
339     if (!CollectionUtils.isEmpty(components)) {
340       components.forEach(component -> {
341         validateImage(vspId, version, validationData, component);
342         validateNic(vspId, version, validationData, component);
343
344       });
345     }
346
347     return validationData;
348   }
349
350   private void validateNic(String vspId, Version version,
351                            Set<CompositionEntityValidationData> validationData,
352                            ComponentEntity component) {
353     Collection<NicEntity> nics =
354         nicDao.list(new NicEntity(vspId, version, component.getId(), null));
355     if (CollectionUtils.isNotEmpty(nics)) {
356       nics.forEach(nicEntity -> {
357         NicEntity nic = nicDao.get(new NicEntity(vspId, version, component.getId(),
358             nicEntity.getId()));
359         NetworkType networkType = nic.getNicCompositionData().getNetworkType();
360         String networkId = nic.getNicCompositionData().getNetworkId();
361         if (networkType.equals(NetworkType.Internal) && networkId == null) {
362           CompositionEntityValidationData compositionEntityValidationData = new
363               CompositionEntityValidationData(CompositionEntityType.nic, nic.getId());
364           compositionEntityValidationData.setEntityName(nic.getNicCompositionData().getName());
365           ErrorCode nicInternalNetworkErrorBuilder = NicInternalNetworkErrorBuilder
366               .getNicNullNetworkIdInternalNetworkIdErrorBuilder();
367           List<String> errors = new ArrayList<>();
368           errors.add(nicInternalNetworkErrorBuilder.message());
369           compositionEntityValidationData.setErrors(errors);
370           validationData.add(compositionEntityValidationData);
371         }
372       });
373     }
374   }
375
376   private void validateImage(String vspId, Version version,
377                              Set<CompositionEntityValidationData> validationData,
378                              ComponentEntity component) {
379     Collection<ImageEntity> images =
380         imageDao.list(new ImageEntity(vspId, version, component.getId(), null));
381     if (CollectionUtils.isEmpty(images)) {
382       CompositionEntityValidationData compositionEntityValidationData = new
383           CompositionEntityValidationData(component.getType(), component.getId());
384       compositionEntityValidationData
385           .setEntityName(component.getComponentCompositionData().getDisplayName());
386       ErrorCode vfcMissingImageErrorBuilder =
387           ComponentErrorBuilder.vfcMissingImageErrorBuilder();
388       List<String> errors = new ArrayList<>();
389       errors.add(vfcMissingImageErrorBuilder.message());
390       compositionEntityValidationData.setErrors(errors);
391       validationData.add(compositionEntityValidationData);
392     }
393   }
394
395   private List<ErrorCode> validateVspFields(VspDetails vspDetails) {
396     List<ErrorCode> errors = new ArrayList<>();
397
398     if (vspDetails.getName() == null) {
399       errors.add(createMissingMandatoryFieldError("name"));
400     }
401     if (vspDetails.getDescription() == null) {
402       errors.add(createMissingMandatoryFieldError("description"));
403     }
404     if (vspDetails.getVendorId() == null) {
405       errors.add(createMissingMandatoryFieldError("vendor Id"));
406     }
407     if (vspDetails.getCategory() == null) {
408       errors.add(createMissingMandatoryFieldError("category"));
409     }
410     if (vspDetails.getSubCategory() == null) {
411       errors.add(createMissingMandatoryFieldError("sub category"));
412     }
413     return errors;
414   }
415
416   private List<ErrorCode> validateMandatoryLicenseFields(VspDetails vspDetails) {
417     List<ErrorCode> errors = new ArrayList<>();
418     if (vspDetails.getVlmVersion() == null) {
419       errors.add(createMissingMandatoryFieldError("licensing version"));
420     }
421     if (vspDetails.getLicenseAgreement() == null) {
422       errors.add(createMissingMandatoryFieldError("license agreement"));
423     }
424     if (CollectionUtils.isEmpty(vspDetails.getFeatureGroups())) {
425       errors.add(createMissingMandatoryFieldError("feature groups"));
426     }
427     return errors;
428   }
429
430   private static ErrorCode createMissingMandatoryFieldError(String fieldName) {
431     return new ValidationErrorBuilder("must be supplied", fieldName).build();
432   }
433
434   private Map<String, List<ErrorMessage>> compile(String vendorSoftwareProductId, Version version,
435                                                   ToscaServiceModel serviceModel) {
436     if (isServiceModelMissing(serviceModel)) {
437       return null;
438     }
439
440     enrichedServiceModelDao.deleteAll(vendorSoftwareProductId, version);
441
442     EnrichmentManager<ToscaServiceModel> enrichmentManager =
443         EnrichmentManagerFactory.getInstance().createInterface();
444     enrichmentManager.init(vendorSoftwareProductId, version);
445     enrichmentManager.setModel(serviceModel);
446     Map<String, List<ErrorMessage>> enrichErrors = enrichmentManager.enrich();
447
448     enrichedServiceModelDao
449         .storeServiceModel(vendorSoftwareProductId, version, enrichmentManager.getModel());
450
451     return enrichErrors;
452   }
453
454   private Collection<ErrorCode> validateLicensingData(VspDetails vspDetails) {
455     if (vspDetails.getVendorId() != null) {
456       Optional<ErrorCode> errorCode = vendorLicenseFacade.validateVendorForUsage(vspDetails.getVendorId(),vspDetails.getVlmVersion());
457       if (errorCode.isPresent()) {
458         return Collections.singleton(errorCode.get());
459       }
460     }
461
462     if (vspDetails.getVendorId() == null || vspDetails.getVlmVersion() == null
463         || vspDetails.getLicenseAgreement() == null
464         || CollectionUtils.isEmpty(vspDetails.getFeatureGroups())) {
465       return Collections.emptyList();
466     }
467     return vendorLicenseFacade
468         .validateLicensingData(vspDetails.getVendorId(), vspDetails.getVlmVersion(),
469             vspDetails.getLicenseAgreement(), vspDetails.getFeatureGroups());
470   }
471
472   @Override
473   public VspDetails createVsp(VspDetails vspDetails) {
474     vspInfoDao.create(vspDetails);
475     vspInfoDao.updateQuestionnaireData(vspDetails.getId(), vspDetails.getVersion(),
476         new JsonSchemaDataGenerator(getVspQuestionnaireSchema(null)).generateData());
477     return vspDetails;
478   }
479
480   @Override
481   public void updateVsp(VspDetails vspDetails) {
482     VspDetails retrieved = vspInfoDao.get(vspDetails);
483     if (retrieved == null) {
484       throw new CoreException((new ErrorCode.ErrorCodeBuilder()
485           .withMessage(String.format("Vsp with id %s and version %s does not exist.",
486               vspDetails.getId(), vspDetails.getVersion().getId()))).build());
487     }
488     vspDetails.setOnboardingMethod(retrieved.getOnboardingMethod());
489
490     //If any existing feature group is removed from VSP which is also associated in DF then
491     //update DF to remove feature group associations.
492     updateDeploymentFlavor(vspDetails);
493
494     updateUniqueName(retrieved.getName(), vspDetails.getName());
495     vspInfoDao.update(vspDetails);
496   }
497
498   private void updateDeploymentFlavor(VspDetails vspDetails) {
499     final List<String> featureGroups = vspDetails.getFeatureGroups();
500     if (featureGroups != null) {
501       final Collection<DeploymentFlavorEntity> deploymentFlavorEntities = deploymentFlavorDao
502           .list(new DeploymentFlavorEntity(vspDetails.getId(), vspDetails
503               .getVersion(), null));
504       if (Objects.nonNull(deploymentFlavorEntities)) {
505         for (DeploymentFlavorEntity deploymentFlavorEntity : deploymentFlavorEntities) {
506           updateDeploymentFlavourEntity(featureGroups, deploymentFlavorEntity);
507         }
508       }
509     }
510   }
511
512   private void updateDeploymentFlavourEntity(List<String> featureGroups,
513                                              DeploymentFlavorEntity deploymentFlavorEntity) {
514     final String featureGroupId =
515         deploymentFlavorEntity.getDeploymentFlavorCompositionData().getFeatureGroupId();
516     if (!featureGroups.contains(featureGroupId)) {
517       DeploymentFlavor deploymentFlavorCompositionData =
518           deploymentFlavorEntity.getDeploymentFlavorCompositionData();
519       deploymentFlavorCompositionData.setFeatureGroupId(null);
520       deploymentFlavorEntity.setDeploymentFlavorCompositionData
521           (deploymentFlavorCompositionData);
522       deploymentFlavorDao.update(deploymentFlavorEntity);
523     }
524   }
525
526
527   @Override
528   public VspDetails getVsp(String vspId, Version version) {
529     return getValidatedVsp(vspId, version);
530   }
531
532   private VspDetails getValidatedVsp(String vspId, Version version) {
533     VspDetails vsp = vspInfoDao.get(new VspDetails(vspId, version));
534     if (vsp == null) {
535       throw new CoreException(new VendorSoftwareProductNotFoundErrorBuilder(vspId).build());
536     }
537     return vsp;
538   }
539
540   @Override
541   public void deleteVsp(String vspId, Version version) {
542     vspMergeDao.deleteHint(vspId, version);
543   }
544
545   @Override
546   public List<PackageInfo> listPackages(String category, String subCategory) {
547     return packageInfoDao.listByCategory(category, subCategory);
548   }
549
550   @Override
551   public File getTranslatedFile(String vspId, Version version) {
552     PackageInfo packageInfo = packageInfoDao.get(new PackageInfo(vspId, version));
553     if (packageInfo == null) {
554       throw new CoreException(new PackageNotFoundErrorBuilder(vspId, version).build());
555     }
556
557     ByteBuffer translatedFileBuffer = packageInfo.getTranslatedFile();
558     if (translatedFileBuffer == null) {
559       throw new CoreException(new PackageInvalidErrorBuilder(vspId, version).build());
560     }
561
562     File translatedFile = new File(VendorSoftwareProductConstants.VSP_PACKAGE_ZIP);
563
564     try (FileOutputStream fos = new FileOutputStream(translatedFile)) {
565       fos.write(translatedFileBuffer.array());
566     } catch (IOException exception) {
567       throw new CoreException(new TranslationFileCreationErrorBuilder(vspId, version).build(),
568           exception);
569     }
570     return translatedFile;
571   }
572
573   @Override
574   public byte[] getOrchestrationTemplateFile(String vspId, Version version) {
575     OrchestrationTemplateEntity uploadData = orchestrationTemplateDao.get(vspId, version);
576     ByteBuffer contentData = uploadData.getContentData();
577     if (contentData == null) {
578       return new byte[0];
579     }
580
581     ByteArrayOutputStream baos = new ByteArrayOutputStream();
582
583     try (final ZipOutputStream zos = new ZipOutputStream(baos);
584          ZipInputStream ignored = new ZipInputStream(
585              new ByteArrayInputStream(contentData.array()))) {
586       zos.write(contentData.array());
587     } catch (IOException exception) {
588       throw new CoreException(new FileCreationErrorBuilder(vspId).build(), exception);
589     }
590     return baos.toByteArray();
591   }
592
593   @Override
594   public OrchestrationTemplateEntity getOrchestrationTemplateInfo(String vspId, Version version) {
595     return orchestrationTemplateDao.getInfo(vspId, version);
596   }
597
598   @Override
599   public Optional<FilesDataStructure> getOrchestrationTemplateStructure(String vspId,
600                                                                         Version version) {
601     Optional<String> jsonFileDataStructure =
602         orchestrationTemplateDao.getOrchestrationTemplateStructure(vspId, version);
603
604     if (jsonFileDataStructure.isPresent() && JsonUtil.isValidJson(jsonFileDataStructure.get())) {
605       return Optional
606           .of(JsonUtil.json2Object(jsonFileDataStructure.get(), FilesDataStructure.class));
607     } else {
608       return Optional.empty();
609     }
610   }
611
612   @Override
613   public PackageInfo createPackage(String vspId, Version version) throws IOException {
614     ToscaServiceModel toscaServiceModel = enrichedServiceModelDao.getServiceModel(vspId, version);
615     VspDetails vspDetails = vspInfoDao.get(new VspDetails(vspId, version));
616     Version vlmVersion = vspDetails.getVlmVersion();
617     if (vlmVersion != null) {
618       populateVersionsForVlm(vspDetails.getVendorId(), vlmVersion);
619     }
620     PackageInfo packageInfo = createPackageInfo(vspDetails);
621
622     ToscaFileOutputServiceCsarImpl toscaServiceTemplateServiceCsar =
623         new ToscaFileOutputServiceCsarImpl();
624     FileContentHandler licenseArtifacts = licenseArtifactsService
625         .createLicenseArtifacts(vspDetails.getId(), vspDetails.getVendorId(), vlmVersion,
626             vspDetails.getFeatureGroups());
627     ETSIService etsiService = new ETSIServiceImpl();
628     if (etsiService.isSol004WithToscaMetaDirectory(toscaServiceModel.getArtifactFiles())) {
629         FileContentHandler handler = toscaServiceModel.getArtifactFiles();
630         Manifest manifest = etsiService.getManifest(handler);
631         etsiService.moveNonManoFileToArtifactFolder(handler, manifest);
632         packageInfo.setResourceType(etsiService.getResourceType(manifest).name());
633     }
634     packageInfo.setTranslatedFile(ByteBuffer.wrap(
635         toscaServiceTemplateServiceCsar.createOutputFile(toscaServiceModel, licenseArtifacts)));
636
637     packageInfoDao.create(packageInfo);
638     return packageInfo;
639   }
640
641   void populateVersionsForVlm(String vlmId, Version vlmVersion) {
642     VersioningManager versioningManager = VersioningManagerFactory.getInstance().createInterface();
643     versioningManager.list(vlmId).stream()
644         .filter(version -> version.getId().equalsIgnoreCase(vlmVersion.getId()))
645         .findAny()
646         .ifPresent(version -> {
647           vlmVersion.setMinor(version.getMinor());
648           vlmVersion.setMajor(version.getMajor());
649         });
650   }
651
652   private PackageInfo createPackageInfo(VspDetails vspDetails) {
653     PackageInfo packageInfo = new PackageInfo(vspDetails.getId(), vspDetails.getVersion());
654     packageInfo.setVspName(vspDetails.getName());
655     packageInfo.setVspDescription(vspDetails.getDescription());
656     packageInfo.setCategory(vspDetails.getCategory());
657     packageInfo.setSubCategory(vspDetails.getSubCategory());
658     packageInfo.setVendorName(vspDetails.getVendorName());
659     packageInfo.setPackageType(VendorSoftwareProductConstants.CSAR);
660     packageInfo.setVendorRelease("1.0"); //todo TBD
661     return packageInfo;
662   }
663
664   @Override
665
666   public QuestionnaireResponse getVspQuestionnaire(String vspId, Version version) {
667     VspQuestionnaireEntity retrieved = vspInfoDao.getQuestionnaire(vspId, version);
668     VersioningUtil.validateEntityExistence(retrieved, new VspQuestionnaireEntity(vspId, version),
669         VspDetails.ENTITY_TYPE);
670
671     String questionnaireData = retrieved.getQuestionnaireData();
672
673     QuestionnaireResponse questionnaireResponse = new QuestionnaireResponse();
674     questionnaireResponse.setData(questionnaireData);
675     questionnaireResponse.setSchema(getVspQuestionnaireSchema(null));
676     return questionnaireResponse;
677   }
678
679   @Override
680   public void updateVspQuestionnaire(String vspId, Version version, String questionnaireData) {
681     vspInfoDao.updateQuestionnaireData(vspId, version, questionnaireData);
682   }
683
684
685   private Map<String, List<ErrorMessage>> validateOrchestrationTemplate(
686       OrchestrationTemplateEntity orchestrationTemplate) throws IOException {
687
688     if (isOrchestrationTemplateMissing(orchestrationTemplate)) {
689       return null;
690     }
691     Map<String, List<ErrorMessage>> validationErrors = new HashMap<>();
692
693     FileContentHandler fileContentMap = CommonUtil.validateAndUploadFileContent(
694         OnboardingTypesEnum.getOnboardingTypesEnum(orchestrationTemplate.getFileSuffix()),
695         orchestrationTemplate.getContentData().array());
696
697     if (CommonUtil.isFileOriginFromZip(orchestrationTemplate.getFileSuffix())) {
698       ValidationManager validationManager =
699           ValidationManagerUtil.initValidationManager(fileContentMap);
700       validationErrors.putAll(validationManager.validate());
701     }
702
703     return
704         MapUtils.isEmpty(MessageContainerUtil.getMessageByLevel(ErrorLevel.ERROR, validationErrors))
705             ? null : validationErrors;
706   }
707
708   private QuestionnaireValidationResult validateQuestionnaire(String vspId, Version version,
709                                                               String onboardingMethod) {
710     // The apis of CompositionEntityDataManager used here are stateful!
711     // so, it must be re-created from scratch when it is used!
712     CompositionEntityDataManager compositionEntityDataManager =
713         CompositionEntityDataManagerFactory.getInstance().createInterface();
714     compositionEntityDataManager
715         .addEntity(vspInfoDao.getQuestionnaire(vspId, version), null);
716
717     Collection<NicEntity> nics = nicDao.listByVsp(vspId, version);
718
719     Map<String, List<String>> nicNamesByComponent = new HashMap<>();
720     for (NicEntity nicEntity : nics) {
721       compositionEntityDataManager.addEntity(nicEntity, null);
722
723       Nic nic = nicEntity.getNicCompositionData();
724       if (nic != null && nic.getName() != null) {
725         List<String> nicNames =
726             nicNamesByComponent.computeIfAbsent(nicEntity.getComponentId(), k -> new ArrayList<>());
727         nicNames.add(nic.getName());
728       }
729     }
730
731     Collection<ComponentEntity> components =
732         componentDao.listCompositionAndQuestionnaire(vspId, version);
733     components.forEach(component -> compositionEntityDataManager.addEntity(component,
734         new ComponentQuestionnaireSchemaInput(nicNamesByComponent.get(component.getId()),
735             JsonUtil.json2Object(component.getQuestionnaireData(), Map.class), null,
736                                                      OnboardingMethod.Manual.name().equals(onboardingMethod))));
737
738     Collection<ComputeEntity> computes = computeDao.listByVsp(vspId, version);
739     computes.forEach(compute -> compositionEntityDataManager.addEntity(compute, null));
740
741     if (OnboardingMethod.Manual.name().equals(onboardingMethod)) {
742       Collection<ImageEntity> images = imageDao.listByVsp(vspId, version);
743       images.forEach(image -> compositionEntityDataManager.addEntity(image, null));
744     }
745
746     Map<CompositionEntityId, Collection<String>> errorsByEntityId =
747         compositionEntityDataManager.validateEntitiesQuestionnaire();
748     if (MapUtils.isNotEmpty(errorsByEntityId)) {
749       compositionEntityDataManager.buildTrees();
750       compositionEntityDataManager.addErrorsToTrees(errorsByEntityId);
751       return new QuestionnaireValidationResult(
752           compositionEntityDataManager.getAllErrorsByVsp(vspId));
753     }
754     return null;
755   }
756
757   @Override
758   public File getInformationArtifact(String vspId, Version version) {
759     VspDetails vspDetails = vspInfoDao.get(new VspDetails(vspId, version));
760
761     if (vspDetails == null) {
762       return null;
763     }
764
765     String vspName = vspDetails.getName();
766     ByteBuffer infoArtifactAsByteBuffer;
767     File infoArtifactFile;
768     try {
769       infoArtifactAsByteBuffer = ByteBuffer.wrap(informationArtifactGenerator.generate(vspId,
770           version).getBytes());
771
772       infoArtifactFile =
773           new File(
774               String.format(VendorSoftwareProductConstants.INFORMATION_ARTIFACT_NAME, vspName));
775       try (OutputStream out = new BufferedOutputStream(new FileOutputStream(infoArtifactFile))) {
776         out.write(infoArtifactAsByteBuffer.array());
777       }
778
779     } catch (IOException ex) {
780       throw new CoreException(new InformationArtifactCreationErrorBuilder(vspId).build(), ex);
781     }
782     return infoArtifactFile;
783   }
784
785   String getVspQuestionnaireSchema(SchemaTemplateInput schemaInput) {
786     return SchemaGenerator
787         .generate(SchemaTemplateContext.questionnaire, CompositionEntityType.vsp, schemaInput);
788   }
789
790   @Override
791   public Optional<Pair<String, byte[]>> get(String vspId, Version version) throws IOException {
792
793     OrchestrationTemplateEntity orchestrationTemplateEntity =
794         orchestrationTemplateDao.get(vspId, version);
795
796     if (isOrchestrationTemplateMissing(orchestrationTemplateEntity)) {
797       return Optional.empty();
798     }
799
800     if (CommonUtil.isFileOriginFromZip(orchestrationTemplateEntity.getFileSuffix())) {
801       return Optional.of(new ImmutablePair<>(OnboardingTypesEnum.ZIP.toString(), candidateService
802           .getZipData(orchestrationTemplateEntity.getContentData())));
803     }
804     return Optional.of(new ImmutablePair<>(orchestrationTemplateEntity.getFileSuffix(),
805         orchestrationTemplateEntity.getContentData().array()));
806   }
807
808   void updateUniqueName(String oldVspName, String newVspName) {
809     uniqueValueUtil.updateUniqueValue(
810         VendorSoftwareProductConstants.UniqueValues.VENDOR_SOFTWARE_PRODUCT_NAME,
811         oldVspName, newVspName);
812   }
813
814   @Override
815   public Collection<ComputeEntity> getComputeByVsp(String vspId, Version version) {
816     return computeDao.listByVsp(vspId, version);
817   }
818
819   private boolean isOrchestrationTemplateMissing(
820       OrchestrationTemplateEntity orchestrationTemplate) {
821     return orchestrationTemplate == null
822         || orchestrationTemplate.getContentData() == null
823         || orchestrationTemplate.getFileSuffix() == null
824         || orchestrationTemplate.getFileName() == null;
825   }
826
827   private boolean isServiceModelMissing(ToscaServiceModel serviceModel) {
828     return serviceModel == null || serviceModel.getEntryDefinitionServiceTemplate() == null;
829   }
830
831   public static class Builder{
832     private VspMergeDao vspMergeDao;
833     private OrchestrationTemplateDao orchestrationTemplateDao;
834     private OrchestrationTemplateCandidateManager orchestrationTemplateCandidateManager;
835     private VendorSoftwareProductInfoDao vspInfoDao;
836     private VendorLicenseFacade vendorLicenseFacade;
837     private ServiceModelDao<ToscaServiceModel, ServiceElement> serviceModelDao;
838     private EnrichedServiceModelDao<ToscaServiceModel, ServiceElement> enrichedServiceModelDao;
839     private VendorLicenseArtifactsService licenseArtifactsService;
840     private InformationArtifactGenerator informationArtifactGenerator;
841     private PackageInfoDao packageInfoDao;
842     private DeploymentFlavorDao deploymentFlavorDao;
843     private ComponentDao componentDao;
844     private ComponentDependencyModelDao componentDependencyModelDao;
845     private NicDao nicDao;
846     private ComputeDao computeDao;
847     private ImageDao imageDao;
848     private ManualVspToscaManager manualVspToscaManager;
849     private UniqueValueDao uniqueValueDao;
850     private CandidateService candidateService;
851
852     public Builder vspMerge(VspMergeDao vspMergeDao){
853       this.vspMergeDao = vspMergeDao;
854       return this;
855     }
856
857     public Builder orchestrationTemplate(OrchestrationTemplateDao orchestrationTemplateDao) {
858       this.orchestrationTemplateDao = orchestrationTemplateDao;
859       return this;
860     }
861
862     public Builder orchestrationTemplateCandidateManager(OrchestrationTemplateCandidateManager orchestrationTemplateCandidateManager) {
863       this.orchestrationTemplateCandidateManager = orchestrationTemplateCandidateManager;
864       return this;
865     }
866
867     public Builder vspInfo(VendorSoftwareProductInfoDao vspInfoDao) {
868       this.vspInfoDao = vspInfoDao;
869       return this;
870     }
871
872     public Builder vendorLicenseFacade(VendorLicenseFacade vendorLicenseFacade) {
873       this.vendorLicenseFacade = vendorLicenseFacade;
874       return this;
875     }
876
877     public Builder serviceModel(ServiceModelDao<ToscaServiceModel, ServiceElement> serviceModelDao) {
878       this.serviceModelDao = serviceModelDao;
879       return this;
880     }
881
882     public Builder enrichedServiceModel(EnrichedServiceModelDao<ToscaServiceModel, ServiceElement> enrichedServiceModelDao) {
883       this.enrichedServiceModelDao = enrichedServiceModelDao;
884       return this;
885     }
886
887     public Builder licenseArtifactsService(VendorLicenseArtifactsService licenseArtifactsService) {
888       this.licenseArtifactsService = licenseArtifactsService;
889       return this;
890     }
891
892     public Builder informationArtifactGenerator(InformationArtifactGenerator informationArtifactGenerator) {
893       this.informationArtifactGenerator = informationArtifactGenerator;
894       return this;
895     }
896
897     public Builder packageInfo(PackageInfoDao packageInfoDao) {
898       this.packageInfoDao = packageInfoDao;
899       return this;
900     }
901
902     public Builder deploymentFlavor(DeploymentFlavorDao deploymentFlavorDao) {
903       this.deploymentFlavorDao = deploymentFlavorDao;
904       return this;
905     }
906
907     public Builder component(ComponentDao componentDao) {
908       this.componentDao = componentDao;
909       return this;
910     }
911
912     public Builder componentDependencyModel(ComponentDependencyModelDao componentDependencyModelDao) {
913       this.componentDependencyModelDao = componentDependencyModelDao;
914       return this;
915     }
916
917     public Builder nic(NicDao nicDao) {
918       this.nicDao = nicDao;
919       return this;
920     }
921
922     public Builder compute(ComputeDao computeDao) {
923       this.computeDao = computeDao;
924       return this;
925     }
926
927     public Builder image(ImageDao imageDao) {
928       this.imageDao = imageDao;
929       return this;
930     }
931
932     public Builder manualVspToscaManager(ManualVspToscaManager manualVspToscaManager) {
933       this.manualVspToscaManager = manualVspToscaManager;
934       return this;
935     }
936
937     public Builder uniqueValue(UniqueValueDao uniqueValueDao) {
938       this.uniqueValueDao = uniqueValueDao;
939       return this;
940     }
941
942     public Builder candidateService(CandidateService candidateService) {
943       this.candidateService = candidateService;
944       return this;
945     }
946
947     private void registerToVersioning() {
948       if(serviceModelDao != null) {
949         serviceModelDao.registerVersioning(
950                 VendorSoftwareProductConstants.VENDOR_SOFTWARE_PRODUCT_VERSIONABLE_TYPE);
951       }
952       if(enrichedServiceModelDao != null) {
953         enrichedServiceModelDao.registerVersioning(
954                 VendorSoftwareProductConstants.VENDOR_SOFTWARE_PRODUCT_VERSIONABLE_TYPE);
955       }
956     }
957
958     public VendorSoftwareProductManager build(){
959       VendorSoftwareProductManagerImpl vendorSoftwareProductManager = new VendorSoftwareProductManagerImpl();
960       vendorSoftwareProductManager.vspMergeDao = this.vspMergeDao;
961       vendorSoftwareProductManager.orchestrationTemplateDao = this.orchestrationTemplateDao;
962       vendorSoftwareProductManager.orchestrationTemplateCandidateManager = this.orchestrationTemplateCandidateManager;
963       vendorSoftwareProductManager.vspInfoDao = this.vspInfoDao;
964       vendorSoftwareProductManager.vendorLicenseFacade = this.vendorLicenseFacade;
965       vendorSoftwareProductManager.serviceModelDao = this.serviceModelDao;
966       vendorSoftwareProductManager.enrichedServiceModelDao = this.enrichedServiceModelDao;
967       vendorSoftwareProductManager.licenseArtifactsService = this.licenseArtifactsService;
968       vendorSoftwareProductManager.informationArtifactGenerator = this.informationArtifactGenerator;
969       vendorSoftwareProductManager.packageInfoDao = this.packageInfoDao;
970       vendorSoftwareProductManager.deploymentFlavorDao = this.deploymentFlavorDao;
971       vendorSoftwareProductManager.componentDao = this.componentDao;
972       vendorSoftwareProductManager.componentDependencyModelDao = this.componentDependencyModelDao;
973       vendorSoftwareProductManager.nicDao = this.nicDao;
974       vendorSoftwareProductManager.computeDao = this.computeDao;
975       vendorSoftwareProductManager.imageDao = this.imageDao;
976       vendorSoftwareProductManager.manualVspToscaManager = this.manualVspToscaManager;
977       vendorSoftwareProductManager.uniqueValueUtil = new UniqueValueUtil(this.uniqueValueDao);
978       vendorSoftwareProductManager.candidateService = candidateService;
979       this.registerToVersioning();
980       return vendorSoftwareProductManager;
981     }
982   }
983
984 }