X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=catalog-be%2Fsrc%2Fmain%2Fjava%2Forg%2Fopenecomp%2Fsdc%2Fbe%2Fcomponents%2Fimpl%2FProductBusinessLogic.java;h=9344f68275af5b05f223538dcecfb8ecc7ccdfad;hb=438650c3a958c9176db3720204ec1ff9af94fc3a;hp=30a9f799fe4b03927251e464ab2b976efa18c76c;hpb=91a31137b44d034823f72b190fc42539993c6593;p=sdc.git diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ProductBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ProductBusinessLogic.java index 30a9f799fe..9344f68275 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ProductBusinessLogic.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ProductBusinessLogic.java @@ -7,9 +7,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -19,12 +19,26 @@ * Modifications copyright (c) 2019 Nokia * ================================================================================ */ - package org.openecomp.sdc.be.components.impl; import fj.data.Either; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import org.apache.commons.lang3.StringUtils; import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException; import org.openecomp.sdc.be.components.impl.exceptions.ComponentException; +import org.openecomp.sdc.be.components.validation.component.ComponentContactIdValidator; +import org.openecomp.sdc.be.components.validation.component.ComponentDescriptionValidator; +import org.openecomp.sdc.be.components.validation.component.ComponentIconValidator; +import org.openecomp.sdc.be.components.validation.component.ComponentNameValidator; +import org.openecomp.sdc.be.components.validation.component.ComponentProjectCodeValidator; +import org.openecomp.sdc.be.components.validation.component.ComponentTagsValidator; +import org.openecomp.sdc.be.components.validation.component.ComponentValidator; import org.openecomp.sdc.be.dao.api.ActionStatus; import org.openecomp.sdc.be.datamodel.api.CategoryTypeEnum; import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum; @@ -36,8 +50,14 @@ import org.openecomp.sdc.be.model.User; import org.openecomp.sdc.be.model.category.CategoryDefinition; import org.openecomp.sdc.be.model.category.GroupingDefinition; import org.openecomp.sdc.be.model.category.SubCategoryDefinition; -import org.openecomp.sdc.be.model.operations.api.ICacheMangerOperation; +import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations; +import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation; +import org.openecomp.sdc.be.model.operations.api.IElementOperation; +import org.openecomp.sdc.be.model.operations.api.IGroupInstanceOperation; +import org.openecomp.sdc.be.model.operations.api.IGroupOperation; +import org.openecomp.sdc.be.model.operations.api.IGroupTypeOperation; import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus; +import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation; import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder; import org.openecomp.sdc.be.model.operations.utils.ComponentValidationUtils; import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum; @@ -48,9 +68,6 @@ import org.openecomp.sdc.common.util.ValidationUtils; import org.openecomp.sdc.exception.ResponseFormat; import org.springframework.beans.factory.annotation.Autowired; -import java.util.*; -import java.util.stream.Collectors; - @org.springframework.stereotype.Component("productBusinessLogic") public class ProductBusinessLogic extends ComponentBusinessLogic { @@ -62,18 +79,24 @@ public class ProductBusinessLogic extends ComponentBusinessLogic { private static List creationRoles; private static List updateRoles; private static List contactsRoles; + private final ComponentInstanceBusinessLogic componentInstanceBusinessLogic; @Autowired - private ComponentInstanceBusinessLogic componentInstanceBusinessLogic; - - @Autowired - private ICacheMangerOperation cacheManagerOperation; - - public ProductBusinessLogic() { + public ProductBusinessLogic(IElementOperation elementDao, IGroupOperation groupOperation, IGroupInstanceOperation groupInstanceOperation, + IGroupTypeOperation groupTypeOperation, GroupBusinessLogic groupBusinessLogic, InterfaceOperation interfaceOperation, + InterfaceLifecycleOperation interfaceLifecycleTypeOperation, ArtifactsBusinessLogic artifactsBusinessLogic, + ComponentInstanceBusinessLogic componentInstanceBusinessLogic, ArtifactsOperations artifactToscaOperation, + ComponentContactIdValidator componentContactIdValidator, ComponentNameValidator componentNameValidator, + ComponentTagsValidator componentTagsValidator, ComponentValidator componentValidator, + ComponentIconValidator componentIconValidator, ComponentProjectCodeValidator componentProjectCodeValidator, + ComponentDescriptionValidator componentDescriptionValidator) { + super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, groupBusinessLogic, interfaceOperation, + interfaceLifecycleTypeOperation, artifactsBusinessLogic, artifactToscaOperation, componentContactIdValidator, componentNameValidator, + componentTagsValidator, componentValidator, componentIconValidator, componentProjectCodeValidator, componentDescriptionValidator); + this.componentInstanceBusinessLogic = componentInstanceBusinessLogic; creationRoles = new ArrayList<>(); updateRoles = new ArrayList<>(); contactsRoles = new ArrayList<>(); - // only PM is allowed to create/update products creationRoles.add(Role.PRODUCT_MANAGER); updateRoles.add(Role.PRODUCT_MANAGER); @@ -81,65 +104,52 @@ public class ProductBusinessLogic extends ComponentBusinessLogic { contactsRoles.add(Role.PRODUCT_MANAGER); } - public Either createProduct(Product product, User user) { AuditingActionEnum actionEnum = AuditingActionEnum.CREATE_RESOURCE; ComponentTypeEnum typeEnum = ComponentTypeEnum.PRODUCT; - // validate user - should be first to get the maximum auditing info in + // case of subsequent failures log.debug("get user from DB"); user = validateUser(user, CREATE_PRODUCT, product, actionEnum, false); // validate user role validateUserRole(user, product, creationRoles, actionEnum, null); - if (product == null) { log.debug("Invalid product json. Check product servlet log for createProduct entry params"); ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT); componentsUtils.auditComponentAdmin(responseFormat, user, product, actionEnum, typeEnum); return Either.right(responseFormat); } - // warn about non-updatable fields checkUnupdatableProductFields(product); - Either validateProductResponse = validateProductBeforeCreate(product, user, actionEnum); if (validateProductResponse.isRight()) { return Either.right(validateProductResponse.right().value()); } - log.debug("send product {} to dao for create", product.getComponentMetadataDefinition().getMetadataDataDefinition().getName()); - Either lockResult = lockComponentByName(product.getSystemName(), product, CREATE_PRODUCT); if (lockResult.isRight()) { ResponseFormat responseFormat = lockResult.right().value(); componentsUtils.auditComponentAdmin(responseFormat, user, product, actionEnum, ComponentTypeEnum.PRODUCT); return Either.right(responseFormat); } - log.debug("Product name locked is {}, status = {}", product.getSystemName(), lockResult); - try { Either createProductEither = toscaOperationFacade.createToscaComponent(product); - if (createProductEither.isRight()) { - ResponseFormat responseFormat = componentsUtils.getResponseFormatByComponent(componentsUtils.convertFromStorageResponse(createProductEither.right().value()), product, typeEnum); + ResponseFormat responseFormat = componentsUtils + .getResponseFormatByComponent(componentsUtils.convertFromStorageResponse(createProductEither.right().value()), product, typeEnum); componentsUtils.auditComponentAdmin(responseFormat, user, product, actionEnum, typeEnum); return Either.right(responseFormat); } - log.debug("Product created successfully"); ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.CREATED); componentsUtils.auditComponentAdmin(responseFormat, user, product, actionEnum, typeEnum); - Product createdProduct = createProductEither.left().value(); - return Either.left(createdProduct); - } finally { graphLockOperation.unlockComponentByName(product.getSystemName(), product.getUniqueId(), NodeTypeEnum.Product); } - } private void checkUnupdatableProductFields(Product product) { @@ -150,99 +160,88 @@ public class ProductBusinessLogic extends ComponentBusinessLogic { } private Either validateProductBeforeCreate(Product product, User user, AuditingActionEnum actionEnum) { - Either validateProductFields = validateProductFieldsBeforeCreate(user, product, actionEnum); if (validateProductFields.isRight()) { return Either.right(validateProductFields.right().value()); } - if (product.getIsActive() == null) { log.debug("no isActive value was provided, setting to default: false"); product.setIsActive(false); } - product.setCreatorUserId(user.getUserId()); - // enrich object log.debug("enrich product with version and state"); product.setState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT); product.setVersion(INITIAL_VERSION); - // Generate invariant UUID - must be here and not in operation since it + // should stay constant during clone String invariantUUID = UniqueIdBuilder.buildInvariantUUID(); product.setInvariantUUID(invariantUUID); - return Either.left(product); } private Either validateProductFieldsBeforeCreate(User user, Product product, AuditingActionEnum actionEnum) { - // To be removed in 1607 + // See below String oldName = product.getName(); - Either componentNameValidation = validateProductNameAndCleanup(user, product, actionEnum); if (componentNameValidation.isRight()) { return componentNameValidation; } - - Either componentNameUniquenessValidation = validateComponentNameUnique(user, product, actionEnum); - if (componentNameUniquenessValidation.isRight()) { - return componentNameUniquenessValidation; + try { + componentNameValidator.validateComponentNameUnique(user, product, actionEnum); + } catch (ComponentException exp) { + return Either.right(exp.getResponseFormat()); } - // To be removed in 1607 and replaced with generic + // validateTagsListAndRemoveDuplicates() + // See comments on the validateTagsListAndRemoveDuplicates(user, + // product, oldName, actionEnum) function Either tagsValidation = validateTagsListAndRemoveDuplicates(user, product, oldName, actionEnum); if (tagsValidation.isRight()) { return tagsValidation; } - - validateIcon(user, product, actionEnum); - - Either projectCodeValidation = validateProjectCode(user, product, actionEnum); - if (projectCodeValidation.isRight()) { - return projectCodeValidation; + componentTagsValidator.validateAndCorrectField(user, product, actionEnum); + try { + componentProjectCodeValidator.validateAndCorrectField(user, product, actionEnum); + } catch (ComponentException exp) { + return Either.right(exp.getResponseFormat()); } Either categoryValidation = validateGrouping(user, product, actionEnum); if (categoryValidation.isRight()) { return categoryValidation; } - Either contactsListValidation = validateAndUpdateProductContactsList(user, product, actionEnum); if (contactsListValidation.isRight()) { return contactsListValidation; } - Either productFullNameValidation = validateProductFullNameAndCleanup(user, product, actionEnum); if (productFullNameValidation.isRight()) { return productFullNameValidation; } - - validateDescriptionAndCleanup(user, product, actionEnum); - + componentDescriptionValidator.validateAndCorrectField(user, product, actionEnum); return Either.left(true); } public Either, ResponseFormat> validateProductNameExists(String productName, String userId) { - - validateUserExists(userId, "validate Product Name Exists", false); - Either dataModelResponse = toscaOperationFacade.validateComponentNameUniqueness(productName, null, ComponentTypeEnum.PRODUCT); + validateUserExists(userId); + Either dataModelResponse = toscaOperationFacade + .validateComponentNameUniqueness(productName, null, ComponentTypeEnum.PRODUCT); // DE242223 - titanDao.commit(); - + janusGraphDao.commit(); if (dataModelResponse.isLeft()) { Map result = new HashMap<>(); result.put("isValid", dataModelResponse.left().value()); log.debug("validation was successfully performed."); return Either.left(result); } - - ResponseFormat responseFormat = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(dataModelResponse.right().value())); - + ResponseFormat responseFormat = componentsUtils + .getResponseFormat(componentsUtils.convertFromStorageResponse(dataModelResponse.right().value())); return Either.right(responseFormat); } @@ -254,7 +253,6 @@ public class ProductBusinessLogic extends ComponentBusinessLogic { componentsUtils.auditComponentAdmin(responseFormat, user, product, actionEnum, ComponentTypeEnum.PRODUCT); return Either.right(responseFormat); } - boolean isProductCreatorInContacts = false; String modifierUserId = user.getUserId(); for (String contact : contacts) { @@ -266,35 +264,30 @@ public class ProductBusinessLogic extends ComponentBusinessLogic { } if (!ValidationUtils.validateContactId(contact)) { log.debug("Product contacts has invalid userId {} for product {}", contact, product.getName()); - ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INVALID_CONTACT, ComponentTypeEnum.PRODUCT.getValue()); + ResponseFormat responseFormat = componentsUtils + .getResponseFormat(ActionStatus.COMPONENT_INVALID_CONTACT, ComponentTypeEnum.PRODUCT.getValue()); componentsUtils.auditComponentAdmin(responseFormat, user, product, actionEnum, ComponentTypeEnum.PRODUCT); return Either.right(responseFormat); } - User contactUser; - try{ - contactUser = validateUserExists(contact, CREATE_PRODUCT, false); + try { + contactUser = validateUserExists(contact); validateUserRole(contactUser, contactsRoles); - } catch(ByActionStatusComponentException e){ + } catch (ByActionStatusComponentException e) { log.debug("Cannot set contact with userId {} as product contact, error: {}", contact, e.getActionStatus()); ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_PRODUCT_CONTACT, contact); componentsUtils.auditComponentAdmin(responseFormat, user, product, actionEnum, ComponentTypeEnum.PRODUCT); throw new ByActionStatusComponentException(e.getActionStatus(), e.getParams()); } } - if (!isProductCreatorInContacts) { log.debug("modifier userId {} not found in product contacts - adding it", modifierUserId); contacts.add(modifierUserId); } - // passed - setting all contacts userIds to lowercase - List tempContacts = contacts.stream() - .map(String::toLowerCase) - .collect(Collectors.toList()); + List tempContacts = contacts.stream().map(String::toLowerCase).collect(Collectors.toList()); ValidationUtils.removeDuplicateFromList(tempContacts); product.setContacts(tempContacts); - return Either.left(true); } @@ -308,10 +301,11 @@ public class ProductBusinessLogic extends ComponentBusinessLogic { // remove duplicated entries for (CategoryDefinition cat : categories) { String catName = cat.getName(); - if (!ValidationUtils.validateStringNotEmpty(catName)) { + if (StringUtils.isEmpty(catName)) { // error missing cat name log.debug("Missing category name for product: {}", product.getName()); - ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_MISSING_CATEGORY, ComponentTypeEnum.PRODUCT.getValue()); + ResponseFormat responseFormat = componentsUtils + .getResponseFormat(ActionStatus.COMPONENT_MISSING_CATEGORY, ComponentTypeEnum.PRODUCT.getValue()); componentsUtils.auditComponentAdmin(responseFormat, user, product, actionEnum, ComponentTypeEnum.PRODUCT); return Either.right(responseFormat); } @@ -330,11 +324,11 @@ public class ProductBusinessLogic extends ComponentBusinessLogic { } for (SubCategoryDefinition subcat : subcategories) { String subCatName = subcat.getName(); - if (!ValidationUtils.validateStringNotEmpty(subCatName)) { + if (StringUtils.isEmpty(subCatName)) { // error missing sub cat name for cat log.debug("Missing or empty sub-category for category {} in product {}", catName, product.getName()); ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_MISSING_SUBCATEGORY); - componentsUtils.auditComponentAdmin(responseFormat, user, product, actionEnum, ComponentTypeEnum.PRODUCT); + componentsUtils.auditComponentAdmin(responseFormat, user, product, actionEnum, ComponentTypeEnum.PRODUCT); return Either.right(responseFormat); } Set subcatEntry = catEntry.get(subCatName); @@ -345,9 +339,10 @@ public class ProductBusinessLogic extends ComponentBusinessLogic { List groupings = subcat.getGroupings(); for (GroupingDefinition group : groupings) { String groupName = group.getName(); - if (!ValidationUtils.validateStringNotEmpty(groupName)) { + if (StringUtils.isEmpty(groupName)) { // error missing grouping for sub cat name and cat - log.debug("Missing or empty groupng name for sub-category: {} for categor: {} in product: {}", subCatName, catName, product.getName()); + log.debug("Missing or empty groupng name for sub-category: {} for categor: {} in product: {}", subCatName, catName, + product.getName()); ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_MISSING_SUBCATEGORY); componentsUtils.auditComponentAdmin(responseFormat, user, product, actionEnum, ComponentTypeEnum.PRODUCT); return Either.right(responseFormat); @@ -360,9 +355,9 @@ public class ProductBusinessLogic extends ComponentBusinessLogic { } } } // for end of checking duplicated - // validate existence - Either, ActionStatus> allProductCategories = elementDao.getAllProductCategories(); + // validate existence + Either, ActionStatus> allProductCategories = elementDao.getAllProductCategories(); if (allProductCategories.isRight()) { log.debug("No product categories {}", allProductCategories.right().value()); ResponseFormat responseFormat = componentsUtils.getResponseFormat(allProductCategories.right().value()); @@ -371,14 +366,14 @@ public class ProductBusinessLogic extends ComponentBusinessLogic { } boolean catExist; // convert non-duplicated to data modeling format and update in the + // input object List newCatList = new ArrayList<>(); - // over all categories from request for (Map.Entry>> entry : nonDuplicatedCategories.entrySet()) { catExist = false; CategoryDefinition categoryDefinition = null; - // over all categories from Titan + // over all categories from JanusGraph List categoriesList = allProductCategories.left().value(); if (categoriesList != null) { for (CategoryDefinition catInDb : categoriesList) { @@ -388,7 +383,6 @@ public class ProductBusinessLogic extends ComponentBusinessLogic { // copy data categoryDefinition = new CategoryDefinition(catInDb); SubCategoryDefinition subCategory = null; - Map> subcats = entry.getValue(); for (Map.Entry> subcat : subcats.entrySet()) { subcatExist = false; @@ -415,9 +409,13 @@ public class ProductBusinessLogic extends ComponentBusinessLogic { } if (!groupExist) { // error grouping isn't defined - // in Titan - ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_GROUP_ASSOCIATION, CategoryTypeEnum.GROUPING.getValue(), group); - componentsUtils.auditComponentAdmin(responseFormat, user, product, actionEnum, ComponentTypeEnum.PRODUCT); + + // in JanusGraph + ResponseFormat responseFormat = componentsUtils + .getResponseFormat(ActionStatus.INVALID_GROUP_ASSOCIATION, CategoryTypeEnum.GROUPING.getValue(), + group); + componentsUtils + .auditComponentAdmin(responseFormat, user, product, actionEnum, ComponentTypeEnum.PRODUCT); return Either.right(responseFormat); } subCategory.addGrouping(groupingDefinition); @@ -426,8 +424,10 @@ public class ProductBusinessLogic extends ComponentBusinessLogic { } } if (!subcatExist) { - // error sub category isn't defined in Titan - ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_GROUP_ASSOCIATION, CategoryTypeEnum.SUBCATEGORY.getValue(), subcat.getKey()); + // error sub category isn't defined in JanusGraph + ResponseFormat responseFormat = componentsUtils + .getResponseFormat(ActionStatus.INVALID_GROUP_ASSOCIATION, CategoryTypeEnum.SUBCATEGORY.getValue(), + subcat.getKey()); componentsUtils.auditComponentAdmin(responseFormat, user, product, actionEnum, ComponentTypeEnum.PRODUCT); return Either.right(responseFormat); } @@ -437,8 +437,9 @@ public class ProductBusinessLogic extends ComponentBusinessLogic { } } if (!catExist) { - // error category isn't defined in Titan - ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_GROUP_ASSOCIATION, CategoryTypeEnum.CATEGORY.getValue(), entry.getKey()); + // error category isn't defined in JanusGraph + ResponseFormat responseFormat = componentsUtils + .getResponseFormat(ActionStatus.INVALID_GROUP_ASSOCIATION, CategoryTypeEnum.CATEGORY.getValue(), entry.getKey()); componentsUtils.auditComponentAdmin(responseFormat, user, product, actionEnum, ComponentTypeEnum.PRODUCT); return Either.right(responseFormat); } @@ -451,17 +452,16 @@ public class ProductBusinessLogic extends ComponentBusinessLogic { public Either getProduct(String productId, User user) { String ecompErrorContext = "Get product"; validateUserNotEmpty(user, ecompErrorContext); - validateUserExists(user, ecompErrorContext, false); - + validateUserExists(user); Either storageStatus = toscaOperationFacade.getToscaElement(productId); - if (storageStatus.isRight()) { log.debug("failed to get resource by id {}", productId); - if (storageStatus.right().value().equals(StorageOperationStatus.NOT_FOUND)) { + if (storageStatus.right().value() == StorageOperationStatus.NOT_FOUND) { // TODO check error return Either.right(componentsUtils.getResponseFormat(ActionStatus.PRODUCT_NOT_FOUND, ComponentTypeEnum.PRODUCT.getValue())); } else { - return Either.right(componentsUtils.getResponseFormatByResource(componentsUtils.convertFromStorageResponse(storageStatus.right().value()), "")); + return Either.right( + componentsUtils.getResponseFormatByResource(componentsUtils.convertFromStorageResponse(storageStatus.right().value()), "")); } } return Either.left(storageStatus.left().value()); @@ -470,94 +470,96 @@ public class ProductBusinessLogic extends ComponentBusinessLogic { public Either deleteProduct(String productId, User user) { String ecompErrorContext = "Delete product"; validateUserNotEmpty(user, ecompErrorContext); - validateUserExists(user, ecompErrorContext, false); - + validateUserExists(user); Either storageStatus = toscaOperationFacade.deleteToscaComponent(productId); - if (storageStatus.isRight()) { log.debug("failed to delete resource by id {}", productId); - return Either.right(componentsUtils.getResponseFormatByResource(componentsUtils.convertFromStorageResponse(storageStatus.right().value()), "")); + return Either + .right(componentsUtils.getResponseFormatByResource(componentsUtils.convertFromStorageResponse(storageStatus.right().value()), "")); } return Either.left(storageStatus.left().value()); } private Either validateProductFullNameAndCleanup(User user, Product product, AuditingActionEnum actionEnum) { String fullName = product.getFullName(); - if (!ValidationUtils.validateStringNotEmpty(fullName)) { - ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.MISSING_ONE_OF_COMPONENT_NAMES, ComponentTypeEnum.PRODUCT.getValue(), PRODUCT_FULL_NAME); + if (StringUtils.isEmpty(fullName)) { + ResponseFormat errorResponse = componentsUtils + .getResponseFormat(ActionStatus.MISSING_ONE_OF_COMPONENT_NAMES, ComponentTypeEnum.PRODUCT.getValue(), PRODUCT_FULL_NAME); componentsUtils.auditComponentAdmin(errorResponse, user, product, actionEnum, ComponentTypeEnum.PRODUCT); return Either.right(errorResponse); } - fullName = ValidationUtils.removeNoneUtf8Chars(fullName); fullName = ValidationUtils.removeHtmlTags(fullName); fullName = ValidationUtils.normaliseWhitespace(fullName); fullName = ValidationUtils.stripOctets(fullName); - if (!ValidationUtils.validateProductFullNameLength(fullName)) { - ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_ELEMENT_INVALID_NAME_LENGTH, ComponentTypeEnum.PRODUCT.getValue(), PRODUCT_FULL_NAME); + ResponseFormat responseFormat = componentsUtils + .getResponseFormat(ActionStatus.COMPONENT_ELEMENT_INVALID_NAME_LENGTH, ComponentTypeEnum.PRODUCT.getValue(), PRODUCT_FULL_NAME); componentsUtils.auditComponentAdmin(responseFormat, user, product, actionEnum, ComponentTypeEnum.PRODUCT); return Either.right(responseFormat); } - if (!ValidationUtils.validateIsEnglish(fullName)) { - ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_ELEMENT_INVALID_NAME_FORMAT, ComponentTypeEnum.PRODUCT.getValue(), PRODUCT_FULL_NAME); + ResponseFormat responseFormat = componentsUtils + .getResponseFormat(ActionStatus.COMPONENT_ELEMENT_INVALID_NAME_FORMAT, ComponentTypeEnum.PRODUCT.getValue(), PRODUCT_FULL_NAME); componentsUtils.auditComponentAdmin(responseFormat, user, product, actionEnum, ComponentTypeEnum.PRODUCT); return Either.right(responseFormat); } - product.setFullName(fullName); return Either.left(true); } private Either validateProductNameAndCleanup(User user, Product product, AuditingActionEnum actionEnum) { String name = product.getName(); - if (!ValidationUtils.validateStringNotEmpty(name)) { - ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.MISSING_ONE_OF_COMPONENT_NAMES, ComponentTypeEnum.PRODUCT.getValue(), PRODUCT_ABBREVIATED_NAME); + if (StringUtils.isEmpty(name)) { + ResponseFormat responseFormat = componentsUtils + .getResponseFormat(ActionStatus.MISSING_ONE_OF_COMPONENT_NAMES, ComponentTypeEnum.PRODUCT.getValue(), PRODUCT_ABBREVIATED_NAME); componentsUtils.auditComponentAdmin(responseFormat, user, product, actionEnum, ComponentTypeEnum.PRODUCT); return Either.right(responseFormat); } - // Product name is required to have same validation and normalization as + // category if (!ValidationUtils.validateCategoryDisplayNameFormat(name)) { - ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_ELEMENT_INVALID_NAME_FORMAT, ComponentTypeEnum.PRODUCT.getValue(), PRODUCT_ABBREVIATED_NAME); + ResponseFormat responseFormat = componentsUtils + .getResponseFormat(ActionStatus.COMPONENT_ELEMENT_INVALID_NAME_FORMAT, ComponentTypeEnum.PRODUCT.getValue(), + PRODUCT_ABBREVIATED_NAME); componentsUtils.auditComponentAdmin(responseFormat, user, product, actionEnum, ComponentTypeEnum.PRODUCT); return Either.right(responseFormat); } - String normalizedName4Display = ValidationUtils.normalizeCategoryName4Display(name); - if (!ValidationUtils.validateCategoryDisplayNameLength(normalizedName4Display)) { - ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_ELEMENT_INVALID_NAME_LENGTH, ComponentTypeEnum.PRODUCT.getValue(), PRODUCT_ABBREVIATED_NAME); + ResponseFormat responseFormat = componentsUtils + .getResponseFormat(ActionStatus.COMPONENT_ELEMENT_INVALID_NAME_LENGTH, ComponentTypeEnum.PRODUCT.getValue(), + PRODUCT_ABBREVIATED_NAME); componentsUtils.auditComponentAdmin(responseFormat, user, product, actionEnum, ComponentTypeEnum.PRODUCT); return Either.right(responseFormat); } - product.setName(normalizedName4Display); String normalizedName4Uniqueness = ValidationUtils.normaliseComponentName(normalizedName4Display); product.setNormalizedName(normalizedName4Uniqueness); - return Either.left(true); } - // This is a workaround for a current tag--->product name behaviour, which + // will be changed in 1607. + // It was agreed with Ella on 23/2/16 that the tag validation of product + // will be made against the old product name (before normalization), + // and in 1607 US will be defined where UI will no longer pass tag of + // component name, and BE will add it by itself after all needed + // normalizations. - private Either validateTagsListAndRemoveDuplicates(User user, Product product, String oldProductName, AuditingActionEnum actionEnum) { - List tagsList = product.getTags(); - validateComponentTags(tagsList, oldProductName, ComponentTypeEnum.PRODUCT, user, product, actionEnum); - ValidationUtils.removeDuplicateFromList(tagsList); + private Either validateTagsListAndRemoveDuplicates(User user, Product product, String oldProductName, + AuditingActionEnum actionEnum) { + componentTagsValidator.validateAndCorrectField(user, product, actionEnum); return Either.left(true); } @Override public void setDeploymentArtifactsPlaceHolder(org.openecomp.sdc.be.model.Component component, User user) { - } public Either updateProductMetadata(String productId, Product updatedProduct, User user) { @@ -570,34 +572,28 @@ public class ProductBusinessLogic extends ComponentBusinessLogic { ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT); return Either.right(responseFormat); } - Either storageStatus = toscaOperationFacade.getToscaElement(productId); if (storageStatus.isRight()) { - if (storageStatus.right().value().equals(StorageOperationStatus.NOT_FOUND)) { - return Either.right(componentsUtils.getResponseFormat(ActionStatus.PRODUCT_NOT_FOUND, ComponentTypeEnum.PRODUCT.name().toLowerCase())); + if (storageStatus.right().value() == StorageOperationStatus.NOT_FOUND) { + return Either + .right(componentsUtils.getResponseFormat(ActionStatus.PRODUCT_NOT_FOUND, ComponentTypeEnum.PRODUCT.name().toLowerCase())); } - return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(storageStatus.right().value(), typeEnum), "")); + return Either + .right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(storageStatus.right().value(), typeEnum), "")); } - Product currentProduct = storageStatus.left().value(); - if (!ComponentValidationUtils.canWorkOnComponent(productId, toscaOperationFacade, user.getUserId())) { - log.info("Restricted operation for user: {}, on product: {}" , user.getUserId(), currentProduct.getCreatorUserId()); + log.info("Restricted operation for user: {}, on product: {}", user.getUserId(), currentProduct.getCreatorUserId()); return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION)); } - Either validationRsponse = validateAndUpdateProductMetadata(user, currentProduct, updatedProduct); if (validationRsponse.isRight()) { log.info("product update metadata: validations field."); return validationRsponse; } - Product productToUpdate = validationRsponse.left().value(); // lock resource - Either lockResult = lockComponent(currentProduct.getUniqueId(), currentProduct, "Update Product Metadata"); - if (lockResult.isRight()) { - return Either.right(lockResult.right().value()); - } + lockComponent(currentProduct.getUniqueId(), currentProduct, "Update Product Metadata"); try { Either updateResponse = toscaOperationFacade.updateToscaElement(productToUpdate); if (updateResponse.isRight()) { @@ -613,69 +609,57 @@ public class ProductBusinessLogic extends ComponentBusinessLogic { } private Either validateAndUpdateProductMetadata(User user, Product currentProduct, Product updatedProduct) { - boolean hasBeenCertified = ValidationUtils.hasBeenCertified(currentProduct.getVersion()); Either response = validateAndUpdateProductName(user, currentProduct, updatedProduct); if (response.isRight()) { ResponseFormat errorResponse = response.right().value(); return Either.right(errorResponse); } - response = validateAndUpdateFullName(user, currentProduct, updatedProduct); if (response.isRight()) { ResponseFormat errorResponse = response.right().value(); return Either.right(errorResponse); } - response = validateAndUpdateDescription(user, currentProduct, updatedProduct, null); if (response.isRight()) { ResponseFormat errorResponse = response.right().value(); return Either.right(errorResponse); } - response = validateAndUpdateCategory(user, currentProduct, updatedProduct); if (response.isRight()) { ResponseFormat errorResponse = response.right().value(); return Either.right(errorResponse); } - response = validateAndUpdateContactList(user, currentProduct, updatedProduct); if (response.isRight()) { ResponseFormat errorResponse = response.right().value(); return Either.right(errorResponse); } - response = validateAndUpdateTags(user, currentProduct, updatedProduct); if (response.isRight()) { ResponseFormat errorResponse = response.right().value(); return Either.right(errorResponse); } - response = validateAndUpdateProjectCode(user, currentProduct, updatedProduct); if (response.isRight()) { ResponseFormat errorResponse = response.right().value(); return Either.right(errorResponse); } - if (updatedProduct.getIsActive() != null) { currentProduct.setIsActive(updatedProduct.getIsActive()); } - response = validateAndUpdateIcon(user, currentProduct, updatedProduct, hasBeenCertified); if (response.isRight()) { ResponseFormat errorResponse = response.right().value(); return Either.right(errorResponse); } - String currentInvariantUuid = currentProduct.getInvariantUUID(); String updatedInvariantUuid = updatedProduct.getInvariantUUID(); - if ((updatedInvariantUuid != null) && (!updatedInvariantUuid.equals(currentInvariantUuid))) { log.warn("Product invariant UUID is automatically set and cannot be updated"); updatedProduct.setInvariantUUID(currentInvariantUuid); } return Either.left(currentProduct); - } private Either validateAndUpdateProductName(User user, Product currentProduct, Product updatedProduct) { @@ -690,16 +674,19 @@ public class ProductBusinessLogic extends ComponentBusinessLogic { } updatedProductName = updatedProduct.getName(); if (!currentProductName.equals(updatedProductName)) { - Either productNameUniquenessValidation = validateComponentNameUnique(user, updatedProduct, null); - if (productNameUniquenessValidation.isRight()) { - return productNameUniquenessValidation; + try { + componentNameValidator.validateComponentNameUnique(user, updatedProduct, null); + } catch (ComponentException exp) { + return Either.right(exp.getResponseFormat()); } currentProduct.setName(updatedProductName); tags = updatedProductName; updatedProductName = ValidationUtils.normalizeCategoryName4Display(updatedProductName); - currentProduct.getComponentMetadataDefinition().getMetadataDataDefinition().setNormalizedName(ValidationUtils.normaliseComponentName(updatedProductName)); + currentProduct.getComponentMetadataDefinition().getMetadataDataDefinition() + .setNormalizedName(ValidationUtils.normaliseComponentName(updatedProductName)); List updatedTags = updatedProduct.getTags(); // As discussed with Ella currently (1604) we are not removing + // the old name from tags. if (updatedTags == null) { updatedTags = currentProduct.getTags(); @@ -725,13 +712,11 @@ public class ProductBusinessLogic extends ComponentBusinessLogic { } private Either validateAndUpdateCategory(User user, Product currentProduct, Product updatedProduct) { - Either validateCategoryResponse = validateGrouping(user, updatedProduct, null); if (validateCategoryResponse.isRight()) { ResponseFormat errorResponse = validateCategoryResponse.right().value(); return Either.right(errorResponse); } - List categoryUpdated = updatedProduct.getCategories(); if (categoryUpdated != null) { currentProduct.setCategories(categoryUpdated); @@ -760,7 +745,8 @@ public class ProductBusinessLogic extends ComponentBusinessLogic { List tagsCurrent = currentProduct.getTags(); if (tagsUpdated != null) { if (!(tagsCurrent.containsAll(tagsUpdated) && tagsUpdated.containsAll(tagsCurrent))) { - Either validatResponse = validateTagsListAndRemoveDuplicates(user, updatedProduct, currentProduct.getName(), null); + Either validatResponse = validateTagsListAndRemoveDuplicates(user, updatedProduct, currentProduct.getName(), + null); if (validatResponse.isRight()) { ResponseFormat errorRespons = validatResponse.right().value(); return Either.right(errorRespons); @@ -777,17 +763,15 @@ public class ProductBusinessLogic extends ComponentBusinessLogic { return Either.left(new ArrayList<>()); } - @Override - protected boolean validateTagPattern(String tag) { - return ValidationUtils.validateCategoryDisplayNameFormat(tag); - } - public Either getProductByNameAndVersion(String productName, String productVersion, String userId) { - validateUserExists(userId, "get Service By Name And Version", false); - Either storageStatus = toscaOperationFacade.getComponentByNameAndVersion(ComponentTypeEnum.PRODUCT, productName, productVersion); + validateUserExists(userId); + Either storageStatus = toscaOperationFacade + .getComponentByNameAndVersion(ComponentTypeEnum.PRODUCT, productName, productVersion); if (storageStatus.isRight()) { log.debug("failed to get service by name {} and version {}", productName, productVersion); - return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.PRODUCT), productName)); + return Either.right(componentsUtils + .getResponseFormat(componentsUtils.convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.PRODUCT), + productName)); } Product product = storageStatus.left().value(); return Either.left(product); @@ -803,19 +787,10 @@ public class ProductBusinessLogic extends ComponentBusinessLogic { return null; } - public ICacheMangerOperation getCacheManagerOperation() { - return cacheManagerOperation; - } - - public void setCacheManagerOperation(ICacheMangerOperation cacheManagerOperation) { - this.cacheManagerOperation = cacheManagerOperation; - } - @Override public Either getUiComponentDataTransferByComponentId(String componentId, - List dataParamsToReturn) { + List dataParamsToReturn) { // TODO Auto-generated method stub return null; } - }