X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=catalog-be%2Fsrc%2Fmain%2Fjava%2Forg%2Fopenecomp%2Fsdc%2Fbe%2Fcomponents%2Fimpl%2FComponentBusinessLogic.java;h=0b60a3671d1bfca5596fa12309630ab07379d852;hb=438650c3a958c9176db3720204ec1ff9af94fc3a;hp=ba1500c9be743fcb0170effef13939eb0e04c8f5;hpb=1ec3dde2067e0181faa8e5098219c93126638aef;p=sdc.git diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentBusinessLogic.java index ba1500c9be..0b60a3671d 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentBusinessLogic.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentBusinessLogic.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,14 +19,18 @@ * Modifications copyright (c) 2019 Nokia * ================================================================================ */ - package org.openecomp.sdc.be.components.impl; import fj.data.Either; -import io.vavr.Function3; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; import java.util.Optional; import java.util.function.BiFunction; import java.util.function.BooleanSupplier; +import java.util.stream.Collectors; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; @@ -49,7 +53,6 @@ import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum; import org.openecomp.sdc.be.dao.utils.MapUtil; import org.openecomp.sdc.be.datamodel.api.HighestFilterEnum; import org.openecomp.sdc.be.datatypes.components.ServiceMetadataDataDefinition; -import org.openecomp.sdc.be.datatypes.elements.AttributeDataDefinition; import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition; import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum; import org.openecomp.sdc.be.datatypes.enums.FilterKeyEnum; @@ -98,62 +101,68 @@ import org.openecomp.sdc.common.util.ValidationUtils; import org.openecomp.sdc.exception.ResponseFormat; import org.springframework.beans.factory.annotation.Autowired; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.stream.Collectors; - public abstract class ComponentBusinessLogic extends BaseBusinessLogic { - protected ArtifactsBusinessLogic artifactsBusinessLogic; + private static final Logger log = Logger.getLogger(ComponentBusinessLogic.class.getName()); protected final GroupBusinessLogic groupBusinessLogic; - + protected ArtifactsBusinessLogic artifactsBusinessLogic; protected GenericTypeBusinessLogic genericTypeBusinessLogic; - protected ComponentDescriptionValidator componentDescriptionValidator; protected ComponentProjectCodeValidator componentProjectCodeValidator; - protected CatalogOperation catalogOperations; protected ComponentIconValidator componentIconValidator; - - protected ComponentValidator componentValidator; protected ComponentTagsValidator componentTagsValidator; protected ComponentNameValidator componentNameValidator; protected ComponentContactIdValidator componentContactIdValidator; - public ComponentBusinessLogic(IElementOperation elementDao, - IGroupOperation groupOperation, - IGroupInstanceOperation groupInstanceOperation, - IGroupTypeOperation groupTypeOperation, - GroupBusinessLogic groupBusinessLogic, - InterfaceOperation interfaceOperation, - InterfaceLifecycleOperation interfaceLifecycleTypeOperation, - ArtifactsBusinessLogic artifactsBusinessLogic, - ArtifactsOperations artifactToscaOperation, - ComponentContactIdValidator componentContactIdValidator, - ComponentNameValidator componentNameValidator, - ComponentTagsValidator componentTagsValidator, - ComponentValidator componentValidator, - ComponentIconValidator componentIconValidator, - ComponentProjectCodeValidator componentProjectCodeValidator, - ComponentDescriptionValidator componentDescriptionValidator){ - - super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, - interfaceOperation, interfaceLifecycleTypeOperation, artifactToscaOperation); + public ComponentBusinessLogic(IElementOperation elementDao, IGroupOperation groupOperation, IGroupInstanceOperation groupInstanceOperation, + IGroupTypeOperation groupTypeOperation, GroupBusinessLogic groupBusinessLogic, + InterfaceOperation interfaceOperation, InterfaceLifecycleOperation interfaceLifecycleTypeOperation, + ArtifactsBusinessLogic artifactsBusinessLogic, ArtifactsOperations artifactToscaOperation, + ComponentContactIdValidator componentContactIdValidator, ComponentNameValidator componentNameValidator, + ComponentTagsValidator componentTagsValidator, ComponentValidator componentValidator, + ComponentIconValidator componentIconValidator, ComponentProjectCodeValidator componentProjectCodeValidator, + ComponentDescriptionValidator componentDescriptionValidator) { + super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, interfaceOperation, interfaceLifecycleTypeOperation, + artifactToscaOperation); this.artifactsBusinessLogic = artifactsBusinessLogic; this.groupBusinessLogic = groupBusinessLogic; this.componentContactIdValidator = componentContactIdValidator; this.componentNameValidator = componentNameValidator; this.componentTagsValidator = componentTagsValidator; - this.componentValidator = componentValidator; this.componentIconValidator = componentIconValidator; this.componentProjectCodeValidator = componentProjectCodeValidator; this.componentDescriptionValidator = componentDescriptionValidator; } + private static Either saveToscaArtifactAndPopulateToscaArtifactsWithResult(Component component, + final ComponentsUtils componentsUtils, + final ArtifactTypeEnum artifactEnum, + final BiFunction> saveToscaArtifactPayloadFunction) { + ArtifactDefinition artifactDefinition = getToscaArtifactByTypeOrThrowException(component, artifactEnum, componentsUtils); + Either result = saveToscaArtifactPayloadFunction.apply(component, artifactDefinition); + if (result.isLeft()) { + ArtifactDefinition def = result.left().value(); + component.getToscaArtifacts().put(def.getArtifactLabel(), def); + } + return result; + } + + private static Optional getToscaArtifactByType(final Map toscaArtifacts, + final ArtifactTypeEnum typeEnum) { + return toscaArtifacts.values().stream().filter(p -> p.getArtifactType().equals(typeEnum.getType())).findAny(); + } + + private static ArtifactDefinition getToscaArtifactByTypeOrThrowException(final Component component, final ArtifactTypeEnum typeEnum, + final ComponentsUtils componentsUtils) { + return Optional.ofNullable(component.getToscaArtifacts()).flatMap(toscaArtifacts -> getToscaArtifactByType(toscaArtifacts, typeEnum)) + .orElseThrow(() -> { + log.debug("Impossible to find a ToscaArtifact with type '{}' for {}", typeEnum.getType(), component); + return new ByResponseFormatComponentException(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND, typeEnum.name())); + }); + } + public void setComponentDescriptionValidator(ComponentDescriptionValidator componentDescriptionValidator) { this.componentDescriptionValidator = componentDescriptionValidator; } @@ -178,29 +187,29 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic { this.componentNameValidator = componentNameValidator; } - @Autowired public void setGenericTypeBusinessLogic(GenericTypeBusinessLogic genericTypeBusinessLogic) { this.genericTypeBusinessLogic = genericTypeBusinessLogic; } - private static final Logger log = Logger.getLogger(ComponentBusinessLogic.class.getName()); - - private static final String TAG_FIELD_LABEL = "tag"; - public abstract Either, ResponseFormat> deleteMarkedComponents(); public abstract ComponentInstanceBusinessLogic getComponentInstanceBL(); - public abstract Either, ResponseFormat> getComponentInstancesFilteredByPropertiesAndInputs(String componentId, String userId); + public abstract Either, ResponseFormat> getComponentInstancesFilteredByPropertiesAndInputs(String componentId, + String userId); /** - * * @param componentId * @param dataParamsToReturn * @return */ - public abstract Either getUiComponentDataTransferByComponentId(String componentId, List dataParamsToReturn); + public abstract Either getUiComponentDataTransferByComponentId(String componentId, + List dataParamsToReturn); + + public Either getComponentMetadata(final String componentId) { + return toscaOperationFacade.getComponentMetadata(componentId); + } User validateUser(User user, String ecompErrorContext, Component component, AuditingActionEnum auditAction, boolean inTransaction) { User validatedUser; @@ -208,14 +217,14 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic { try { validateUserNotEmpty(user, ecompErrorContext); validatedUser = validateUserExists(user); - } catch(ByActionStatusComponentException e){ - if(e.getActionStatus() == ActionStatus.MISSING_INFORMATION){ + } catch (ByActionStatusComponentException e) { + if (e.getActionStatus() == ActionStatus.MISSING_INFORMATION) { user.setUserId("UNKNOWN"); } responseFormat = componentsUtils.getResponseFormat(e.getActionStatus(), e.getParams()); componentsUtils.auditComponentAdmin(responseFormat, user, component, auditAction, component.getComponentType()); throw e; - } catch(ByResponseFormatComponentException e){ + } catch (ByResponseFormatComponentException e) { responseFormat = e.getResponseFormat(); componentsUtils.auditComponentAdmin(responseFormat, user, component, auditAction, component.getComponentType()); throw e; @@ -230,72 +239,99 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic { } try { validateUserRole(user, roles); - }catch (ByActionStatusComponentException e) { + } catch (ByActionStatusComponentException e) { ResponseFormat responseFormat = componentsUtils.getResponseFormat(e.getActionStatus(), e.getParams()); handleComponentException(component, comment, responseFormat, user, auditAction); throw e; - }catch (ByResponseFormatComponentException e) { + } catch (ByResponseFormatComponentException e) { ResponseFormat responseFormat = e.getResponseFormat(); handleComponentException(component, comment, responseFormat, user, auditAction); throw e; } } - private void handleComponentException(Component component, String comment, ResponseFormat responseFormat, - User user, AuditingActionEnum auditAction){ + private void handleComponentException(Component component, String comment, ResponseFormat responseFormat, User user, + AuditingActionEnum auditAction) { String commentStr = null; String distrStatus = null; ComponentTypeEnum componentType = component.getComponentType(); - if (componentType == ComponentTypeEnum.SERVICE) { - distrStatus = ((ServiceMetadataDataDefinition) component.getComponentMetadataDefinition().getMetadataDataDefinition()).getDistributionStatus(); + if (componentType == ComponentTypeEnum.SERVICE) { + distrStatus = ((ServiceMetadataDataDefinition) component.getComponentMetadataDefinition().getMetadataDataDefinition()) + .getDistributionStatus(); commentStr = comment; } componentsUtils.auditComponent(responseFormat, user, component, auditAction, new ResourceCommonInfo(componentType.getValue()), ResourceVersionInfo.newBuilder().distributionStatus(distrStatus).build(), - ResourceVersionInfo.newBuilder().distributionStatus(distrStatus).build(), - commentStr, null, null); + ResourceVersionInfo.newBuilder().distributionStatus(distrStatus).build(), commentStr, null, null); } public Either validateConformanceLevel(String componentUuid, ComponentTypeEnum componentTypeEnum, String userId) { log.trace("validate conformance level"); - if (componentTypeEnum != ComponentTypeEnum.SERVICE) { log.error("conformance level validation for non service component, id {}", componentUuid); ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT); return Either.right(errorResponse); } - validateUserExists(userId); - - Either eitherComponent = toscaOperationFacade.getLatestComponentMetadataByUuid(componentUuid, JsonParseFlagEnum.ParseMetadata, null); + Either eitherComponent = toscaOperationFacade + .getLatestComponentMetadataByUuid(componentUuid, JsonParseFlagEnum.ParseMetadata, null); if (eitherComponent.isRight()) { log.error("can't validate conformance level, component not found, uuid {}", componentUuid); BeEcompErrorManager.getInstance().logBeComponentMissingError("validateConformanceLevel", componentTypeEnum.getValue(), componentUuid); - StorageOperationStatus status = eitherComponent.right().value(); ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(status, componentTypeEnum); ResponseFormat responseFormat = componentsUtils.getResponseFormat(actionStatus); return Either.right(responseFormat); } - String componentConformanceLevel = eitherComponent.left().value().getMetadataDataDefinition().getConformanceLevel(); if (StringUtils.isBlank(componentConformanceLevel)) { log.error("component conformance level property is null or empty, uuid {}", componentUuid); ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR); return Either.right(errorResponse); } - String configConformanceLevel = ConfigurationManager.getConfigurationManager().getConfiguration().getMinToscaConformanceLevel(); Boolean result = true; if (CommonBeUtils.conformanceLevelCompare(componentConformanceLevel, configConformanceLevel) < 0) { - log.error("invalid asset conformance level, uuid {}, asset conformanceLevel {}, config conformanceLevel {}", componentUuid, componentConformanceLevel, configConformanceLevel); + log.error("invalid asset conformance level, uuid {}, asset conformanceLevel {}, config conformanceLevel {}", componentUuid, + componentConformanceLevel, configConformanceLevel); result = false; } log.trace("conformance level validation finished"); - return Either.left(result); } + protected void validateIcon(User user, Component component, AuditingActionEnum actionEnum) { + log.debug("validate Icon"); + ComponentTypeEnum type = component.getComponentType(); + String icon = component.getIcon(); + if (StringUtils.isEmpty(icon)) { + log.info("icon is missing."); + ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_MISSING_ICON, type.getValue()); + componentsUtils.auditComponentAdmin(errorResponse, user, component, actionEnum, type); + throw new ComponentException(ActionStatus.COMPONENT_MISSING_ICON, type.getValue()); + } + try { + validateIcon(icon, type); + } catch (ComponentException e) { + ResponseFormat responseFormat = + e.getResponseFormat() != null ? e.getResponseFormat() : componentsUtils.getResponseFormat(e.getActionStatus(), e.getParams()); + componentsUtils.auditComponentAdmin(responseFormat, user, component, actionEnum, type); + throw e; + } + } + + private void validateIcon(String icon, ComponentTypeEnum type) { + if (icon != null) { + if (!ValidationUtils.validateIconLength(icon)) { + log.debug("icon exceeds max length"); + throw new ComponentException(ActionStatus.COMPONENT_ICON_EXCEEDS_LIMIT, type.getValue(), "" + ValidationUtils.ICON_MAX_LENGTH); + } + if (!ValidationUtils.validateIcon(icon)) { + log.info("icon is invalid."); + throw new ComponentException(ActionStatus.COMPONENT_INVALID_ICON, type.getValue()); + } + } + } protected void checkComponentFieldsForOverrideAttempt(Component component) { if (component.getLifecycleState() != null) { @@ -331,87 +367,93 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic { } } - public CapReqDef getRequirementsAndCapabilities(String componentId, ComponentTypeEnum componentTypeEnum, String userId) { + protected void validateComponentFieldsBeforeCreate(User user, Component component, AuditingActionEnum actionEnum) { + // validate component name uniqueness + log.debug("validate component name "); + componentNameValidator.validateAndCorrectField(user, component, actionEnum); + // validate description + log.debug("validate description"); + componentDescriptionValidator.validateAndCorrectField(user, component, actionEnum); + // validate tags + log.debug("validate tags"); + componentTagsValidator.validateAndCorrectField(user, component, actionEnum); + // validate contact info + log.debug("validate contact info"); + componentContactIdValidator.validateAndCorrectField(user, component, actionEnum); + // validate icon + log.debug("validate icon"); + validateIcon(user, component, actionEnum); + } + public CapReqDef getRequirementsAndCapabilities(String componentId, ComponentTypeEnum componentTypeEnum, String userId) { validateUserExists(userId); ComponentParametersView filter = new ComponentParametersView(true); filter.setIgnoreCapabilities(false); filter.setIgnoreRequirements(false); filter.setIgnoreComponentInstances(false); - try { Component component = validateComponentExists(componentId, componentTypeEnum, filter); return new CapReqDef(component.getRequirements(), component.getCapabilities()); - }catch (ComponentException e){ + } catch (ComponentException e) { BeEcompErrorManager.getInstance().logBeComponentMissingError("getRequirementsAndCapabilities", componentTypeEnum.getValue(), componentId); throwComponentException(e.getResponseFormat()); } return null; } - public Either, ResponseFormat> getLatestVersionNotAbstractComponents(boolean isAbstractAbstract, ComponentTypeEnum componentTypeEnum, String internalComponentType, List componentUids, + public Either, ResponseFormat> getLatestVersionNotAbstractComponents(boolean isAbstractAbstract, + ComponentTypeEnum componentTypeEnum, + String internalComponentType, List componentUids, String userId) { - try{ + try { validateUserExists(userId); List result = new ArrayList<>(); List componentsUidToFetch = new ArrayList<>(); componentsUidToFetch.addAll(componentUids); if (!componentsUidToFetch.isEmpty()) { log.debug("Number of Components to fetch from graph is {}", componentsUidToFetch.size()); - Either, StorageOperationStatus> nonCheckoutCompResponse = toscaOperationFacade.getLatestVersionNotAbstractComponents(isAbstractAbstract, componentTypeEnum, internalComponentType, componentsUidToFetch); - + Either, StorageOperationStatus> nonCheckoutCompResponse = toscaOperationFacade + .getLatestVersionNotAbstractComponents(isAbstractAbstract, componentTypeEnum, internalComponentType, componentsUidToFetch); if (nonCheckoutCompResponse.isLeft()) { log.debug("Retrived Resource successfully."); result.addAll(nonCheckoutCompResponse.left().value()); } else { - return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(nonCheckoutCompResponse.right().value()))); + return Either.right( + componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(nonCheckoutCompResponse.right().value()))); } } return Either.left(result); - } - finally{ + } finally { janusGraphDao.commit(); } } - private Boolean isHighest(HighestFilterEnum highestFilter) { - Boolean isHighest = null; - switch (highestFilter) { - case ALL: - break; - case HIGHEST_ONLY: - isHighest = true; - break; - case NON_HIGHEST_ONLY: - isHighest = false; - break; - default: - break; - } - return isHighest; - } - - public Either, ResponseFormat> getLatestVersionNotAbstractComponentsMetadata(boolean isAbstractAbstract, HighestFilterEnum highestFilter, ComponentTypeEnum componentTypeEnum, String internalComponentType, String userId) { - ResponseFormat responseFormat = null; - - try{ + public Either, ResponseFormat> getLatestVersionNotAbstractComponentsMetadata(final boolean isAbstractAbstract, + final HighestFilterEnum highestFilter, + final ComponentTypeEnum componentTypeEnum, + final String internalComponentType, String userId, + final String modelName, + final boolean includeNormativeExtensionModels) { + Either, StorageOperationStatus> nonCheckoutCompResponse = null; + try { validateUserExists(userId); - Boolean isHighest = isHighest(highestFilter); - Either, StorageOperationStatus> nonCheckoutCompResponse = toscaOperationFacade.getLatestVersionNotAbstractMetadataOnly(isAbstractAbstract, componentTypeEnum, internalComponentType); - + nonCheckoutCompResponse = toscaOperationFacade + .getLatestVersionNotAbstractMetadataOnly(isAbstractAbstract, componentTypeEnum, internalComponentType, modelName, + includeNormativeExtensionModels); if (nonCheckoutCompResponse.isLeft()) { log.debug("Retrieved Resource successfully."); return Either.left(nonCheckoutCompResponse.left().value()); } - responseFormat = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(nonCheckoutCompResponse.right().value())); + return Either + .right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(nonCheckoutCompResponse.right().value()))); } finally { - janusGraphDao.commit(); + if (nonCheckoutCompResponse != null && nonCheckoutCompResponse.isLeft()) { + janusGraphDao.commit(); + } } - return Either.right(responseFormat); } public void setDeploymentArtifactsPlaceHolder(Component component, User user) { - } @SuppressWarnings("unchecked") @@ -424,141 +466,105 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic { String componentSystemName = component.getSystemName(); String componentType = component.getComponentType().getValue().toLowerCase(); Map toscaArtifacts = ConfigurationManager.getConfigurationManager().getConfiguration().getToscaArtifacts(); - if (toscaArtifacts != null) { for (Entry artifactInfoMap : toscaArtifacts.entrySet()) { Map artifactInfo = (Map) artifactInfoMap.getValue(); - ArtifactDefinition artifactDefinition = artifactsBusinessLogic.createArtifactPlaceHolderInfo(componentUniqueId, artifactInfoMap.getKey(), artifactInfo, user, ArtifactGroupTypeEnum.TOSCA); - artifactDefinition.setArtifactName(ValidationUtils.normalizeFileName(componentType + "-" + componentSystemName + artifactInfo.get("artifactName"))); + ArtifactDefinition artifactDefinition = artifactsBusinessLogic + .createArtifactPlaceHolderInfo(componentUniqueId, artifactInfoMap.getKey(), artifactInfo, user, ArtifactGroupTypeEnum.TOSCA); + artifactDefinition + .setArtifactName(ValidationUtils.normalizeFileName(componentType + "-" + componentSystemName + artifactInfo.get("artifactName"))); artifactMap.put(artifactDefinition.getArtifactLabel(), artifactDefinition); } } component.setToscaArtifacts(artifactMap); } - public Either populateToscaArtifacts(Component component, User user, boolean isInCertificationRequest, boolean inTransaction, boolean shouldLock) { + public Either populateToscaArtifacts(Component component, User user, boolean isInCertificationRequest, + boolean inTransaction, boolean shouldLock) { return populateToscaArtifacts(component, user, isInCertificationRequest, inTransaction, shouldLock, true, true); } - public Either populateToscaArtifacts(Component component, User user, boolean isInCertificationRequest, boolean inTransaction, boolean shouldLock, boolean retrieveResource) { + public Either populateToscaArtifacts(Component component, User user, boolean isInCertificationRequest, + boolean inTransaction, boolean shouldLock, boolean retrieveResource) { return populateToscaArtifacts(component, user, isInCertificationRequest, inTransaction, shouldLock, true, retrieveResource); } - private Either populateToscaArtifacts(Component component, User user, boolean isInCertificationRequest, boolean inTransaction, boolean shouldLock, boolean fetchTemplatesFromDB, boolean retrieveResource) { + private Either populateToscaArtifacts(Component component, User user, boolean isInCertificationRequest, + boolean inTransaction, boolean shouldLock, boolean fetchTemplatesFromDB, + boolean retrieveResource) { if (retrieveResource) { Either toscaElement = toscaOperationFacade.getToscaFullElement(component.getUniqueId()); - if ( toscaElement.isRight() ){ - throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(toscaElement.right().value(), component.getComponentType())); + if (toscaElement.isRight()) { + throw new ByActionStatusComponentException( + componentsUtils.convertFromStorageResponse(toscaElement.right().value(), component.getComponentType())); } component = toscaElement.left().value(); } - - Either generateToscaRes = - saveToscaArtifactAndPopulateToscaArtifactsWithResult(component, componentsUtils, - ArtifactTypeEnum.TOSCA_TEMPLATE, - (comp, toscaArtifact) -> - saveToscaArtifactPayload(toscaArtifact, comp, user, isInCertificationRequest, shouldLock, - inTransaction, fetchTemplatesFromDB)); - + Either generateToscaRes = saveToscaArtifactAndPopulateToscaArtifactsWithResult(component, componentsUtils, + ArtifactTypeEnum.TOSCA_TEMPLATE, + (comp, toscaArtifact) -> saveToscaArtifactPayload(toscaArtifact, comp, user, isInCertificationRequest, shouldLock, inTransaction, + fetchTemplatesFromDB)); if (!isAbstractResource(component)) { - generateToscaRes = saveToscaArtifactAndPopulateToscaArtifactsWithResult(component, componentsUtils, - ArtifactTypeEnum.TOSCA_CSAR, - (comp, toscaArtifactArg) -> saveToscaArtifactPayload(toscaArtifactArg, comp, user, - isInCertificationRequest, shouldLock, inTransaction, true)); + generateToscaRes = saveToscaArtifactAndPopulateToscaArtifactsWithResult(component, componentsUtils, ArtifactTypeEnum.TOSCA_CSAR, + (comp, toscaArtifactArg) -> saveToscaArtifactPayload(toscaArtifactArg, comp, user, isInCertificationRequest, shouldLock, + inTransaction, true)); } return generateToscaRes; } - private static Either saveToscaArtifactAndPopulateToscaArtifactsWithResult( - Component component, - final ComponentsUtils componentsUtils, - final ArtifactTypeEnum artifactEnum, - final BiFunction> saveToscaArtifactPayloadFunction) { - - ArtifactDefinition artifactDefinition = getToscaArtifactByTypeOrThrowException(component, artifactEnum, - componentsUtils); - - Either result = - saveToscaArtifactPayloadFunction.apply(component, artifactDefinition); - - if (result.isLeft()) { - ArtifactDefinition def = result.left().value(); - component.getToscaArtifacts().put(def.getArtifactLabel(), def); - } - - return result; - } - - private static Optional getToscaArtifactByType( - final Map toscaArtifacts, - final ArtifactTypeEnum typeEnum) { - return toscaArtifacts.values().stream() - .filter(p -> p.getArtifactType().equals(typeEnum.getType())) - .findAny(); - } - - private static ArtifactDefinition getToscaArtifactByTypeOrThrowException( - final Component component, - final ArtifactTypeEnum typeEnum, - final ComponentsUtils componentsUtils) { - - return Optional.ofNullable(component.getToscaArtifacts()) - .flatMap(toscaArtifacts -> getToscaArtifactByType(toscaArtifacts, typeEnum)) - .orElseThrow(() -> { - log.debug("Impossible to find a ToscaArtifact with type '{}' for {}", typeEnum.getType(), component); - return new ByResponseFormatComponentException( - componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND, typeEnum.name())); - }); - } - private boolean isAbstractResource(Component component) { - return component.getComponentType() == ComponentTypeEnum.RESOURCE && ((Resource)component).isAbstract(); + return component.getComponentType() == ComponentTypeEnum.RESOURCE && ((Resource) component).isAbstract(); } - private Either saveToscaArtifactPayload(ArtifactDefinition artifactDefinition, org.openecomp.sdc.be.model.Component component, User user, boolean isInCertificationRequest, boolean shouldLock, - boolean inTransaction, boolean fetchTemplatesFromDB) { - return artifactsBusinessLogic.generateAndSaveToscaArtifact(artifactDefinition, component, user, isInCertificationRequest, shouldLock, inTransaction, fetchTemplatesFromDB); + private Either saveToscaArtifactPayload(ArtifactDefinition artifactDefinition, + org.openecomp.sdc.be.model.Component component, User user, + boolean isInCertificationRequest, boolean shouldLock, + boolean inTransaction, boolean fetchTemplatesFromDB) { + return artifactsBusinessLogic + .generateAndSaveToscaArtifact(artifactDefinition, component, user, isInCertificationRequest, shouldLock, inTransaction, + fetchTemplatesFromDB); } - public ImmutablePair getToscaModelByComponentUuid(ComponentTypeEnum componentType, String uuid, ResourceCommonInfo resourceCommonInfo) { - + public ImmutablePair getToscaModelByComponentUuid(ComponentTypeEnum componentType, String uuid, + ResourceCommonInfo resourceCommonInfo) { Either, StorageOperationStatus> latestVersionEither = toscaOperationFacade.getComponentListByUuid(uuid, null); - if (latestVersionEither.isRight()) { - throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(latestVersionEither.right().value(), componentType)); + throw new ByActionStatusComponentException( + componentsUtils.convertFromStorageResponse(latestVersionEither.right().value(), componentType)); } - List components = latestVersionEither.left().value(); - Component component = components.stream().filter(Component::isHighestVersion).findFirst().orElse(null); - if(component == null){ + if (component == null) { component = components.stream().filter(c -> c.getLifecycleState() == LifecycleStateEnum.CERTIFIED).findFirst().orElse(null); } - - if(component == null){ - throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(StorageOperationStatus.NOT_FOUND, componentType))); + if (component == null) { + throw new ByResponseFormatComponentException( + componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(StorageOperationStatus.NOT_FOUND, componentType))); } resourceCommonInfo.setResourceName(component.getName()); // TODO remove after migration - handle artifact not found(no + // placeholder) if (null == component.getToscaArtifacts() || component.getToscaArtifacts().isEmpty()) { - throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND, ArtifactTypeEnum.TOSCA_CSAR.name())); + throw new ByResponseFormatComponentException( + componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND, ArtifactTypeEnum.TOSCA_CSAR.name())); } - ArtifactDefinition csarArtifact = component.getToscaArtifacts().values().stream() - .filter(p -> p.getArtifactType().equals(ArtifactTypeEnum.TOSCA_CSAR.getType())) - .findAny().get(); + + final ArtifactDefinition csarArtifact = component.getToscaArtifacts().values().stream() + .filter(p -> p.getArtifactType().equals(ArtifactTypeEnum.TOSCA_CSAR.getType())).findAny().orElseThrow(() -> { + throw new ByResponseFormatComponentException( + componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND, ArtifactTypeEnum.TOSCA_CSAR.name())); + }); return artifactsBusinessLogic.handleDownloadToscaModelRequest(component, csarArtifact); } protected StorageOperationStatus markComponentToDelete(Component component) { - ComponentTypeEnum componentType = component.getComponentType(); String uniqueId = component.getUniqueId(); if (Boolean.TRUE.equals(component.getIsDeleted())) { log.info("component {} already marked as deleted. id= {}, type={}", component.getName(), uniqueId, componentType); return StorageOperationStatus.NOT_FOUND; } - StorageOperationStatus markResourceToDelete = toscaOperationFacade.markComponentToDelete(component); if (StorageOperationStatus.OK != markResourceToDelete) { log.debug("failed to mark component {} of type {} for delete. error = {}", uniqueId, componentType, markResourceToDelete); @@ -570,7 +576,8 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic { } } - public Either validateAndUpdateDescription(User user, Component currentComponent, Component updatedComponent, AuditingActionEnum auditingAction) { + public Either validateAndUpdateDescription(User user, Component currentComponent, Component updatedComponent, + AuditingActionEnum auditingAction) { String descriptionUpdated = updatedComponent.getDescription(); String descriptionCurrent = currentComponent.getDescription(); if (descriptionUpdated != null && !descriptionCurrent.equals(descriptionUpdated)) { @@ -595,7 +602,8 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic { return Either.left(true); } - public Either validateAndUpdateIcon(User user, Component currentComponent, Component updatedComponent, boolean hasBeenCertified) { + public Either validateAndUpdateIcon(User user, Component currentComponent, Component updatedComponent, + boolean hasBeenCertified) { String iconUpdated = updatedComponent.getIcon(); String iconCurrent = currentComponent.getIcon(); if (iconUpdated != null && !iconCurrent.equals(iconUpdated)) { @@ -604,7 +612,8 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic { currentComponent.setIcon(updatedComponent.getIcon()); } else { log.info("icon {} cannot be updated once the component has been certified once.", iconUpdated); - ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_PARAMETER_CANNOT_BE_CHANGED, "Icon", currentComponent.getComponentType().name().toLowerCase()); + ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_PARAMETER_CANNOT_BE_CHANGED, "Icon", + currentComponent.getComponentType().name().toLowerCase()); return Either.right(errorResponse); } } @@ -612,14 +621,12 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic { } protected Either, ResponseFormat> deleteMarkedComponents(ComponentTypeEnum componentType) { - log.trace("start deleteMarkedComponents"); Either, StorageOperationStatus> deleteMarkedElements = toscaOperationFacade.deleteMarkedElements(componentType); - - - if ( deleteMarkedElements.isRight()){ + if (deleteMarkedElements.isRight()) { janusGraphDao.rollback(); - ResponseFormat responseFormat = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(deleteMarkedElements.right().value(), componentType)); + ResponseFormat responseFormat = componentsUtils + .getResponseFormat(componentsUtils.convertFromStorageResponse(deleteMarkedElements.right().value(), componentType)); return Either.right(responseFormat); } log.trace("end deleteMarkedComponents"); @@ -642,32 +649,27 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic { } /** - * * @param componentId * @param user * @param dataParamsToReturn - ui list of params to return * @return */ - - public Either getComponentDataFilteredByParams(String componentId, User user, List dataParamsToReturn) { - + public Either getComponentDataFilteredByParams(String componentId, User user, + List dataParamsToReturn) { if (user != null) { validateUserExists(user); } - - UiComponentDataTransfer result = new UiComponentDataTransfer(); - - if(dataParamsToReturn == null || dataParamsToReturn.isEmpty()) { + UiComponentDataTransfer result = new UiComponentDataTransfer(); + if (dataParamsToReturn == null || dataParamsToReturn.isEmpty()) { Either.left(result); - } else { - Either uiDataTransferEither = getUiComponentDataTransferByComponentId(componentId, dataParamsToReturn); - if(uiDataTransferEither.isRight()){ + Either uiDataTransferEither = getUiComponentDataTransferByComponentId(componentId, + dataParamsToReturn); + if (uiDataTransferEither.isRight()) { return Either.right(uiDataTransferEither.right().value()); } result = uiDataTransferEither.left().value(); } - return Either.left(result); } @@ -675,7 +677,7 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic { List genericAndComponentInputs = new ArrayList<>(); List genericInputs = genericTypeBusinessLogic.generateInputsFromGenericTypeProperties(genericType); genericAndComponentInputs.addAll(genericInputs); - if (null != component.getInputs()){ + if (null != component.getInputs()) { List nonGenericInputsFromComponent = getAllNonGenericInputsFromComponent(genericInputs, component.getInputs()); genericAndComponentInputs.addAll(nonGenericInputsFromComponent); } @@ -686,7 +688,6 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic { if (genericInputs == null) { return componentInputs; } - Map inputByNameMap = MapUtil.toMap(genericInputs, InputDefinition::getName); List componentNonGenericInputs = new ArrayList<>(); componentInputs.stream().forEach(input -> { @@ -697,41 +698,70 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic { return componentNonGenericInputs; } - protected Resource fetchAndSetDerivedFromGenericType(T component){ - Either genericTypeEither = this.genericTypeBusinessLogic.fetchDerivedFromGenericType(component); - if(genericTypeEither.isRight()){ - log.debug("Failed to fetch latest generic type for component {} of type", component.getName(), component.assetType()); - throw new ByActionStatusComponentException(ActionStatus.GENERIC_TYPE_NOT_FOUND, component.assetType()); + protected void generatePropertiesFromGenericType(final Component component, final Resource genericType) { + if (CollectionUtils.isEmpty(genericType.getProperties())) { + return; + } + final List genericTypePropertyList = genericType.getProperties().stream().map(PropertyDefinition::new) + .peek(propertyDefinition -> propertyDefinition.setUniqueId(null)).collect(Collectors.toList()); + if (component.getProperties() == null) { + component.setProperties(new ArrayList<>(genericTypePropertyList)); + } else { + List servicePropertyList = component.getProperties(); + genericTypePropertyList.stream() + .filter(property -> servicePropertyList.stream().noneMatch(property1 -> property1.getName().equals(property.getName()))) + .forEach(servicePropertyList::add); } - Resource genericTypeResource = genericTypeEither.left().value(); + component.getProperties().forEach(propertyDefinition -> propertyDefinition.setUniqueId(null)); + } + + protected Resource fetchAndSetDerivedFromGenericType(final T component) { + return fetchAndSetDerivedFromGenericType(component, null); + } + + protected Resource fetchAndSetDerivedFromGenericType(final T component, final String toscaType) { + final Resource genericTypeResource = fetchDerivedFromGenericType(component, toscaType); component.setDerivedFromGenericInfo(genericTypeResource); return genericTypeResource; } - public Either>, ResponseFormat> getFilteredComponentInstanceProperties(String componentId, Map> filters, String userId) { + public Resource fetchDerivedFromGenericType(final T component, final String toscaType) { + final Either genericTypeEither = this.genericTypeBusinessLogic.fetchDerivedFromGenericType(component, toscaType); + if (genericTypeEither.isRight()) { + log.debug("Failed to fetch latest generic type for component {} of type {}", component.getName(), component.assetType()); + throw new ByActionStatusComponentException(ActionStatus.GENERIC_TYPE_NOT_FOUND, component.assetType()); + } + return genericTypeEither.left().value(); + } + + + public Either>, ResponseFormat> getFilteredComponentInstanceProperties(String componentId, + Map> filters, + String userId) { Either>, ResponseFormat> response = null; Either getResourceRes = null; - try{ - if(!filters.containsKey(FilterKeyEnum.NAME_FRAGMENT) && StringUtils.isEmpty(filters.get(FilterKeyEnum.NAME_FRAGMENT).get(0))){ + try { + if (!filters.containsKey(FilterKeyEnum.NAME_FRAGMENT) && StringUtils.isEmpty(filters.get(FilterKeyEnum.NAME_FRAGMENT).get(0))) { response = Either.right(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT)); } if (userId != null && response == null) { validateUserExists(userId); } - if(response == null){ + if (response == null) { getResourceRes = toscaOperationFacade.getToscaElement(componentId); - if(getResourceRes.isRight()){ - response = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(getResourceRes.right().value()))); + if (getResourceRes.isRight()) { + response = Either + .right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(getResourceRes.right().value()))); } } - if(response == null){ + if (response == null) { response = getFilteredComponentInstancesProperties(getResourceRes.left().value(), filters); } - } catch(Exception e){ + } catch (Exception e) { log.debug("The exception {} occured during filtered instance properties fetching. the containing component is {}. ", e, componentId); response = Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR)); - } finally{ - if (response != null && response.isLeft()){ + } finally { + if (response != null && response.isLeft()) { toscaOperationFacade.commit(); } else { toscaOperationFacade.rollback(); @@ -740,22 +770,25 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic { return response; } - private Either>, ResponseFormat> getFilteredComponentInstancesProperties(Component component, Map> filters) { - - Map> filteredProperties = new HashMap<>(); + private Either>, ResponseFormat> getFilteredComponentInstancesProperties(Component component, + Map> filters) { + Map> filteredProperties = new HashMap<>(); Either>, ResponseFormat> result = Either.left(filteredProperties); List filteredInstances = getFilteredInstances(component, filters.get(FilterKeyEnum.RESOURCE_TYPE)); - String propertyNameFragment= filters.get(FilterKeyEnum.NAME_FRAGMENT).get(0); - boolean searchByFragment = propertyNameFragment.length() > 3 ; - if(CollectionUtils.isNotEmpty(filteredInstances)){ - for(ComponentInstance instance : filteredInstances){ - if(component.getComponentInstancesProperties()!=null &&component.getComponentInstancesProperties().containsKey(instance.getUniqueId())){ - List currProperties = getFilteredComponentInstanceProperties(component.getComponentInstancesProperties().get(instance.getUniqueId()), propertyNameFragment, searchByFragment); + String propertyNameFragment = filters.get(FilterKeyEnum.NAME_FRAGMENT).get(0); + boolean searchByFragment = propertyNameFragment.length() > 3; + if (CollectionUtils.isNotEmpty(filteredInstances)) { + for (ComponentInstance instance : filteredInstances) { + if (component.getComponentInstancesProperties() != null && component.getComponentInstancesProperties() + .containsKey(instance.getUniqueId())) { + List currProperties = getFilteredComponentInstanceProperties( + component.getComponentInstancesProperties().get(instance.getUniqueId()), propertyNameFragment, searchByFragment); setFilteredProperties(filteredProperties, instance, currProperties); } - if(component.getComponentInstancesInputs()!=null && component.getComponentInstancesInputs().containsKey(instance.getUniqueId())){ - List currInputs = getFilteredComponentInstanceInputs(component.getComponentInstancesInputs().get(instance.getUniqueId()), propertyNameFragment, searchByFragment); - if(CollectionUtils.isNotEmpty(currInputs)){ + if (component.getComponentInstancesInputs() != null && component.getComponentInstancesInputs().containsKey(instance.getUniqueId())) { + List currInputs = getFilteredComponentInstanceInputs( + component.getComponentInstancesInputs().get(instance.getUniqueId()), propertyNameFragment, searchByFragment); + if (CollectionUtils.isNotEmpty(currInputs)) { checkFilteredProperties(filteredProperties, instance, currInputs); } } @@ -764,34 +797,38 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic { return result; } - private void setFilteredProperties(Map> filteredProperties, ComponentInstance instance, List currProperties) { - if(CollectionUtils.isNotEmpty(currProperties)){ + private void setFilteredProperties(Map> filteredProperties, ComponentInstance instance, + List currProperties) { + if (CollectionUtils.isNotEmpty(currProperties)) { filteredProperties.put(instance.getUniqueId(), currProperties); } } - private void checkFilteredProperties(Map> filteredProperties, ComponentInstance instance, List currInputs) { - if(filteredProperties.get(instance.getUniqueId())!=null){ + private void checkFilteredProperties(Map> filteredProperties, ComponentInstance instance, + List currInputs) { + if (filteredProperties.get(instance.getUniqueId()) != null) { filteredProperties.get(instance.getUniqueId()).addAll(currInputs); } else { filteredProperties.put(instance.getUniqueId(), currInputs); } } - private List getFilteredComponentInstanceInputs(List inputs, String propertyNameFragment, boolean searchByFragment) { + private List getFilteredComponentInstanceInputs(List inputs, + String propertyNameFragment, boolean searchByFragment) { return inputs.stream().filter(i -> isMatchingInput(i, propertyNameFragment, searchByFragment)).collect(Collectors.toList()); } - private List getFilteredComponentInstanceProperties(List instanceProperties, String propertyNameFragment, boolean searchByFragment) { + private List getFilteredComponentInstanceProperties(List instanceProperties, + String propertyNameFragment, boolean searchByFragment) { return instanceProperties.stream().filter(p -> isMatchingProperty(p, propertyNameFragment, searchByFragment)).collect(Collectors.toList()); } private boolean isMatchingInput(ComponentInstanceInput input, String propertyNameFragment, boolean searchByFragment) { boolean isMatching = false; - if(searchByFragment && input.getName().toLowerCase().contains(propertyNameFragment)){ + if (searchByFragment && input.getName().toLowerCase().contains(propertyNameFragment)) { isMatching = true; } - if(!searchByFragment && input.getName().equalsIgnoreCase(propertyNameFragment)){ + if (!searchByFragment && input.getName().equalsIgnoreCase(propertyNameFragment)) { isMatching = true; } return isMatching; @@ -799,56 +836,50 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic { private boolean isMatchingProperty(ComponentInstanceProperty property, String propertyNameFragment, boolean searchByFragment) { boolean isMatching = false; - if(searchByFragment && property.getName().toLowerCase().contains(propertyNameFragment)){ + if (searchByFragment && property.getName().toLowerCase().contains(propertyNameFragment)) { isMatching = true; } - if(!searchByFragment && property.getName().equalsIgnoreCase(propertyNameFragment)){ + if (!searchByFragment && property.getName().equalsIgnoreCase(propertyNameFragment)) { isMatching = true; } - if (!isMatching && !ToscaPropertyType.isPrimitiveType(property.getType())){ + if (!isMatching && !ToscaPropertyType.isPrimitiveType(property.getType())) { isMatching = isMatchingComplexPropertyByRecursively(property, propertyNameFragment, searchByFragment); } return isMatching; } - private boolean isMatchingComplexPropertyByRecursively(PropertyDataDefinition property, String propertyNameFragment, boolean searchByFragment) { + private boolean isMatchingComplexPropertyByRecursively(PropertyDataDefinition property, String propertyNameFragment, boolean searchByFragment) { String propertyType; - List dataTypeProperties; + List dataTypeProperties; DataTypeDefinition currentProperty; - if(searchByFragment && property.getName().toLowerCase().contains(propertyNameFragment.toLowerCase())){ + if (searchByFragment && property.getName().toLowerCase().contains(propertyNameFragment.toLowerCase())) { return true; } - if(!searchByFragment && property.getName().equalsIgnoreCase(propertyNameFragment)){ + if (!searchByFragment && property.getName().equalsIgnoreCase(propertyNameFragment)) { return true; } - propertyType = isEmptyInnerType(property) ? property.getType() : property.getSchema().getProperty().getType(); - - if(ToscaPropertyType.isScalarType(propertyType)){ + if (ToscaPropertyType.isScalarType(propertyType)) { return false; } - Either getDataTypeByNameRes = propertyOperation.getDataTypeByName(propertyType); - if(getDataTypeByNameRes.isRight()){ + Either getDataTypeByNameRes = propertyOperation.getDataTypeByName(propertyType, null); + if (getDataTypeByNameRes.isRight()) { return false; } currentProperty = getDataTypeByNameRes.left().value(); dataTypeProperties = currentProperty.getProperties(); - boolean dataPropertiesNotNull = CollectionUtils.isNotEmpty(dataTypeProperties); - BooleanSupplier dataMatchesComplexProperty = () -> isMatchingComplexProperty(propertyNameFragment, - searchByFragment, dataTypeProperties); - BooleanSupplier parentPropertiesNotNull = () -> CollectionUtils - .isNotEmpty(currentProperty.getDerivedFrom().getProperties()); - BooleanSupplier parentDataMatchesComplexProperty = () -> isMatchingComplexProperty(propertyNameFragment, - searchByFragment, currentProperty.getDerivedFrom().getProperties()); - - return ((dataPropertiesNotNull && dataMatchesComplexProperty.getAsBoolean()) - || (parentPropertiesNotNull.getAsBoolean() && parentDataMatchesComplexProperty.getAsBoolean())); + BooleanSupplier dataMatchesComplexProperty = () -> isMatchingComplexProperty(propertyNameFragment, searchByFragment, dataTypeProperties); + BooleanSupplier parentPropertiesNotNull = () -> CollectionUtils.isNotEmpty(currentProperty.getDerivedFrom().getProperties()); + BooleanSupplier parentDataMatchesComplexProperty = () -> isMatchingComplexProperty(propertyNameFragment, searchByFragment, + currentProperty.getDerivedFrom().getProperties()); + return ((dataPropertiesNotNull && dataMatchesComplexProperty.getAsBoolean()) || (parentPropertiesNotNull.getAsBoolean() + && parentDataMatchesComplexProperty.getAsBoolean())); } private boolean isMatchingComplexProperty(String propertyNameFragment, boolean searchByFragment, List dataTypeProperties) { - for(PropertyDefinition prop : dataTypeProperties){ - if(isMatchingComplexPropertyByRecursively(prop, propertyNameFragment, searchByFragment)){ + for (PropertyDefinition prop : dataTypeProperties) { + if (isMatchingComplexPropertyByRecursively(prop, propertyNameFragment, searchByFragment)) { return true; } } @@ -856,20 +887,22 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic { } private boolean isEmptyInnerType(PropertyDataDefinition property) { - return property == null|| property.getSchema() == null || property.getSchema().getProperty() == null || property.getSchema().getProperty().getType() == null; + return property == null || property.getSchema() == null || property.getSchema().getProperty() == null + || property.getSchema().getProperty().getType() == null; } public Either shouldUpgradeToLatestGeneric(Component clonedComponent) { - - if(!clonedComponent.deriveFromGeneric()) + if (!clonedComponent.deriveFromGeneric() || StringUtils.isNotEmpty(clonedComponent.getModel())) { return Either.left(false); + } Boolean shouldUpgrade = false; String currentGenericType = clonedComponent.getDerivedFromGenericType(); String currentGenericVersion = clonedComponent.getDerivedFromGenericVersion(); Resource genericTypeResource = fetchAndSetDerivedFromGenericType(clonedComponent); - if(null == currentGenericType || !currentGenericType.equals(genericTypeResource.getToscaResourceName()) || !currentGenericVersion.equals(genericTypeResource.getVersion())){ + if (null == currentGenericType || !currentGenericType.equals(genericTypeResource.getToscaResourceName()) || !currentGenericVersion + .equals(genericTypeResource.getVersion())) { shouldUpgrade = upgradeToLatestGeneric(clonedComponent, genericTypeResource); - if(!shouldUpgrade) { + if (!shouldUpgrade) { reverntUpdateOfGenericVersion(clonedComponent, currentGenericType, currentGenericVersion); } } @@ -881,42 +914,49 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic { clonedComponent.setDerivedFromGenericVersion(currentGenericVersion); } - private Either, String> validateNoConflictingProperties(List currentList, List upgradedList) { + private Either, String> validateNoConflictingProperties(List currentList, + List upgradedList) { Map currentMap = ToscaDataDefinition.listToMapByName(currentList); Map upgradedMap = ToscaDataDefinition.listToMapByName(upgradedList); return ToscaDataDefinition.mergeDataMaps(upgradedMap, currentMap, true); } - private boolean shouldUpgradeNodeType(Component componentToCheckOut, Resource latestGeneric){ - + private boolean shouldUpgradeNodeType(Component componentToCheckOut, Resource latestGeneric) { List genericTypeProps = latestGeneric.getProperties(); - Either, String> validPropertiesMerge = validateNoConflictingProperties(genericTypeProps, ((Resource)componentToCheckOut).getProperties()); + Either, String> validPropertiesMerge = validateNoConflictingProperties(genericTypeProps, + ((Resource) componentToCheckOut).getProperties()); if (validPropertiesMerge.isRight()) { - log.debug("property {} cannot be overriden, check out performed without upgrading to latest generic", validPropertiesMerge.right().value()); + if (log.isDebugEnabled()) { + log.debug("property {} cannot be overriden, check out performed without upgrading to latest generic", + validPropertiesMerge.right().value()); + } return false; } - List genericTypeAttributes = latestGeneric.getAttributes(); - final Either, String> validAttributesMerge = validateNoConflictingProperties( - genericTypeAttributes, ((Resource) componentToCheckOut).getAttributes()); + List genericTypeAttributes = latestGeneric.getAttributes(); + final Either, String> validAttributesMerge = validateNoConflictingProperties(genericTypeAttributes, + ((Resource) componentToCheckOut).getAttributes()); if (validAttributesMerge.isRight()) { - log.debug("attribute {} cannot be overriden, check out performed without upgrading to latest generic", validAttributesMerge.right().value()); + if (log.isDebugEnabled()) { + log.debug("attribute {} cannot be overriden, check out performed without upgrading to latest generic", + validAttributesMerge.right().value()); + } return false; } return true; } private boolean upgradeToLatestGeneric(Component componentToCheckOut, Resource latestGeneric) { - if (!componentToCheckOut.shouldGenerateInputs()) { //node type - validate properties and attributes return shouldUpgradeNodeType(componentToCheckOut, latestGeneric); } List genericTypeProps = latestGeneric.getProperties(); - List genericTypeInputs = null == genericTypeProps? null : genericTypeBusinessLogic.convertGenericTypePropertiesToInputsDefintion(genericTypeProps, latestGeneric.getUniqueId()); + List genericTypeInputs = null == genericTypeProps ? null + : genericTypeBusinessLogic.convertGenericTypePropertiesToInputsDefintion(genericTypeProps, latestGeneric.getUniqueId()); List currentList = new ArrayList<>(); // nullify existing ownerId from existing list and merge into updated list if (null != componentToCheckOut.getInputs()) { - for(InputDefinition input : componentToCheckOut.getInputs()) { + for (InputDefinition input : componentToCheckOut.getInputs()) { InputDefinition copy = new InputDefinition(input); copy.setOwnerId(null); currentList.add(copy); @@ -926,27 +966,26 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic { componentToCheckOut.setInputs(currentList); return true; } - Either, String> eitherMerged = validateNoConflictingProperties(genericTypeInputs, currentList); if (eitherMerged.isRight()) { - log.debug("input {} cannot be overriden, check out performed without upgrading to latest generic", eitherMerged.right().value()); + if (log.isDebugEnabled()) { + log.debug("input {} cannot be overriden, check out performed without upgrading to latest generic", eitherMerged.right().value()); + } return false; } componentToCheckOut.setInputs(new ArrayList<>(eitherMerged.left().value().values())); return true; } - private List getFilteredInstances(Component component, List resourceTypes) { List filteredInstances = null; - if(CollectionUtils.isEmpty(resourceTypes)){ + if (CollectionUtils.isEmpty(resourceTypes)) { filteredInstances = component.getComponentInstances(); + } else if (CollectionUtils.isNotEmpty(component.getComponentInstances())) { + filteredInstances = component.getComponentInstances().stream().filter(i -> isMatchingType(i.getOriginType(), resourceTypes)) + .collect(Collectors.toList()); } - else if(CollectionUtils.isNotEmpty(component.getComponentInstances())){ - filteredInstances = component.getComponentInstances() - .stream().filter(i -> isMatchingType(i.getOriginType(), resourceTypes)).collect(Collectors.toList()); - } - if(filteredInstances == null){ + if (filteredInstances == null) { filteredInstances = new ArrayList<>(); } return filteredInstances; @@ -954,8 +993,8 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic { private boolean isMatchingType(OriginTypeEnum originType, List resourceTypes) { boolean isMatchingType = false; - for(String resourceType : resourceTypes){ - if(originType == OriginTypeEnum.findByValue(resourceType.toUpperCase())){ + for (String resourceType : resourceTypes) { + if (originType == OriginTypeEnum.findByValue(resourceType.toUpperCase())) { isMatchingType = true; break; } @@ -968,14 +1007,16 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic { return Either.right(ActionStatus.GENERAL_ERROR); } - protected Either updateCatalog(Component component, ChangeTypeEnum changeStatus){ - log.debug("update Catalog start with Component Type {} And Componet Name {} with change status {}", component.getComponentType().name(), component.getName(), changeStatus.name()); - ActionStatus status = catalogOperations.updateCatalog(changeStatus,component); - if(status != ActionStatus.OK){ - return Either.right( componentsUtils.getResponseFormat(status)); + protected Either updateCatalog(Component component, ChangeTypeEnum changeStatus) { + if (log.isDebugEnabled()) { + log.debug("update Catalog start with Component Type {} And Componet Name {} with change status {}", + component.getComponentType().name(), component.getName(), changeStatus.name()); } - - return Either.left(component); + ActionStatus status = catalogOperations.updateCatalog(changeStatus, component); + if (status != ActionStatus.OK) { + return Either.right(componentsUtils.getResponseFormat(status)); + } + return Either.left(component); } public CatalogOperation getCatalogOperations() { @@ -990,7 +1031,4 @@ public abstract class ComponentBusinessLogic extends BaseBusinessLogic { public List throwComponentException(ResponseFormat responseFormat) { throw new ByResponseFormatComponentException(responseFormat); } - } - -