diff options
Diffstat (limited to 'catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CommonImportManager.java')
-rw-r--r-- | catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CommonImportManager.java | 258 |
1 files changed, 128 insertions, 130 deletions
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CommonImportManager.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CommonImportManager.java index c3ecda3e03..326022d806 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CommonImportManager.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CommonImportManager.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,10 +19,21 @@ * Modifications copyright (c) 2019 Nokia * ================================================================================ */ - package org.openecomp.sdc.be.components.impl; +import static java.util.stream.Collectors.toList; + import fj.data.Either; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.function.BiFunction; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; import org.apache.commons.lang3.tuple.ImmutablePair; import org.openecomp.sdc.be.components.impl.ImportUtils.ResultStatusEnum; import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException; @@ -47,24 +58,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.yaml.snakeyaml.Yaml; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.function.BiFunction; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.stream.Collectors; - -import static java.util.stream.Collectors.toList; - @Component("commonImportManager") public class CommonImportManager { private static final Logger log = Logger.getLogger(CommonImportManager.class.getName()); - private final ComponentsUtils componentsUtils; private final PropertyOperation propertyOperation; @@ -81,12 +78,10 @@ public class CommonImportManager { private static List<PropertyDefinition> getProperties(Map<String, Object> toscaJson) { List<PropertyDefinition> values = null; Either<Map<String, PropertyDefinition>, ResultStatusEnum> properties = ImportUtils.getProperties(toscaJson); - if (properties.isLeft()) { values = new ArrayList<>(); Map<String, PropertyDefinition> propertiesMap = properties.left().value(); if (propertiesMap != null && !propertiesMap.isEmpty()) { - for (Entry<String, PropertyDefinition> entry : propertiesMap.entrySet()) { String propName = entry.getKey(); PropertyDefinition propertyDefinition = entry.getValue(); @@ -96,28 +91,27 @@ public class CommonImportManager { } } } - return values; } + private static <T> List<T> append(List<T> list, T value) { + list.add(value); + return list; + } + protected void setPropertiesMap(Map<String, Object> toscaJson, Consumer<Map<String, PropertyDefinition>> consumer) { final List<PropertyDefinition> properties = getProperties(toscaJson); if (properties != null) { - Map<String, PropertyDefinition> collect = properties.stream() - .collect(Collectors.toMap(PropertyDefinition::getName, Function.identity())); + Map<String, PropertyDefinition> collect = properties.stream().collect(Collectors.toMap(PropertyDefinition::getName, Function.identity())); consumer.accept(collect); } } - public interface ICreateElementType<T1, T2, T3> { - T3 createElement(T1 firstArg, T2 secondArg); - } - - protected <T> Either<List<T>, ActionStatus> createElementTypesFromYml(String elementTypesYml, ICreateElementType<String, Map<String, Object>, T> createApi) { - + protected <T> Either<List<T>, ActionStatus> createElementTypesFromYml(String elementTypesYml, + ICreateElementType<String, Map<String, Object>, T> createApi) { List<T> elementTypes; Map<String, Object> toscaJson = convertToFieldMap(elementTypesYml); - if (toscaJson==null) { + if (toscaJson == null) { return Either.right(ActionStatus.INVALID_YAML_FILE); } elementTypes = createElementTypesFromToscaJsonMap(createApi, toscaJson); @@ -135,11 +129,9 @@ public class CommonImportManager { return toscaJson; } - - protected <T extends ToscaDataDefinition> List<T> createTypesFromToscaJsonMap( - BiFunction<String, Map<String, Object>, T> createApi, Map<String, Object> toscaJson) { + protected <T extends ToscaDataDefinition> List<T> createTypesFromToscaJsonMap(BiFunction<String, Map<String, Object>, T> createApi, + Map<String, Object> toscaJson) { List<T> elementTypes = new ArrayList<>(); - for (Entry<String, Object> elementTypeNameDataEntry : toscaJson.entrySet()) { String elementTypeName = elementTypeNameDataEntry.getKey(); Map<String, Object> elementTypeJsonData = (Map<String, Object>) elementTypeNameDataEntry.getValue(); @@ -149,10 +141,9 @@ public class CommonImportManager { return elementTypes; } - protected <T> List<T> createElementTypesFromToscaJsonMap( - ICreateElementType<String, Map<String, Object>, T> createApi, Map<String, Object> toscaJson) { + protected <T> List<T> createElementTypesFromToscaJsonMap(ICreateElementType<String, Map<String, Object>, T> createApi, + Map<String, Object> toscaJson) { List<T> elementTypes = new ArrayList<>(); - for (Entry<String, Object> elementTypeNameDataEntry : toscaJson.entrySet()) { String elementTypeName = elementTypeNameDataEntry.getKey(); Map<String, Object> elementTypeJsonData = (Map<String, Object>) elementTypeNameDataEntry.getValue(); @@ -162,10 +153,9 @@ public class CommonImportManager { return elementTypes; } - protected <T> Map<String, T> createElementTypesMapFromToscaJsonMap( - ICreateElementType<String, Map<String, Object>, T> createApi, Map<String, Object> toscaJson) { + protected <T> Map<String, T> createElementTypesMapFromToscaJsonMap(ICreateElementType<String, Map<String, Object>, T> createApi, + Map<String, Object> toscaJson) { Map<String, T> elementTypesMap = new HashMap<>(); - Iterator<Entry<String, Object>> elementTypesEntryItr = toscaJson.entrySet().iterator(); while (elementTypesEntryItr.hasNext()) { Entry<String, Object> elementTypeNameDataEntry = elementTypesEntryItr.next(); @@ -184,31 +174,27 @@ public class CommonImportManager { } } - public enum ElementTypeEnum { - POLICY_TYPE, GROUP_TYPE, DATA_TYPE, CAPABILITY_TYPE, INTERFACE_LIFECYCLE_TYPE, RELATIONSHIP_TYPE - } - private ActionStatus convertFromStorageResponseForElementType(StorageOperationStatus status, ElementTypeEnum elementTypeEnum) { ActionStatus ret; switch (elementTypeEnum) { - case GROUP_TYPE: - ret = componentsUtils.convertFromStorageResponseForGroupType(status); - break; - case DATA_TYPE: - ret = componentsUtils.convertFromStorageResponseForDataType(status); - break; - case CAPABILITY_TYPE: - ret = componentsUtils.convertFromStorageResponseForCapabilityType(status); - break; - case INTERFACE_LIFECYCLE_TYPE: - ret = componentsUtils.convertFromStorageResponseForLifecycleType(status); - break; - case RELATIONSHIP_TYPE: - ret = componentsUtils.convertFromStorageResponseForRelationshipType(status); - break; - default: - ret = componentsUtils.convertFromStorageResponse(status); - break; + case GROUP_TYPE: + ret = componentsUtils.convertFromStorageResponseForGroupType(status); + break; + case DATA_TYPE: + ret = componentsUtils.convertFromStorageResponseForDataType(status); + break; + case CAPABILITY_TYPE: + ret = componentsUtils.convertFromStorageResponseForCapabilityType(status); + break; + case INTERFACE_LIFECYCLE_TYPE: + ret = componentsUtils.convertFromStorageResponseForLifecycleType(status); + break; + case RELATIONSHIP_TYPE: + ret = componentsUtils.convertFromStorageResponseForRelationshipType(status); + break; + default: + ret = componentsUtils.convertFromStorageResponse(status); + break; } return ret; } @@ -216,22 +202,21 @@ public class CommonImportManager { private <T> ResponseFormat getResponseFormatForElementType(ActionStatus actionStatus, ElementTypeEnum elementTypeEnum, T elementTypeDefinition) { ResponseFormat ret; switch (elementTypeEnum) { - case GROUP_TYPE: - ret = componentsUtils.getResponseFormatByGroupType(actionStatus, (GroupTypeDefinition) elementTypeDefinition); - break; - case POLICY_TYPE: - ret = componentsUtils.getResponseFormatByPolicyType(actionStatus, (PolicyTypeDefinition) elementTypeDefinition); - break; - case DATA_TYPE: - ret = componentsUtils.getResponseFormatByDataType(actionStatus, (DataTypeDefinition) elementTypeDefinition, null); - break; - case CAPABILITY_TYPE: - ret = componentsUtils.getResponseFormatByCapabilityType(actionStatus, (CapabilityTypeDefinition) elementTypeDefinition); - break; - - default: - ret = componentsUtils.getResponseFormat(actionStatus); - break; + case GROUP_TYPE: + ret = componentsUtils.getResponseFormatByGroupType(actionStatus, (GroupTypeDefinition) elementTypeDefinition); + break; + case POLICY_TYPE: + ret = componentsUtils.getResponseFormatByPolicyType(actionStatus, (PolicyTypeDefinition) elementTypeDefinition); + break; + case DATA_TYPE: + ret = componentsUtils.getResponseFormatByDataType(actionStatus, (DataTypeDefinition) elementTypeDefinition, null); + break; + case CAPABILITY_TYPE: + ret = componentsUtils.getResponseFormatByCapabilityType(actionStatus, (CapabilityTypeDefinition) elementTypeDefinition); + break; + default: + ret = componentsUtils.getResponseFormat(actionStatus); + break; } return ret; } @@ -264,11 +249,13 @@ public class CommonImportManager { } return createdElementTypes; } - + protected <T> Either<List<ImmutablePair<T, Boolean>>, ResponseFormat> createElementTypesByDao(List<T> elementTypesToCreate, - Function<T, Either<ActionStatus, ResponseFormat>> validator, Function<T, ImmutablePair<ElementTypeEnum, String>> elementInfoGetter, - Function<String, Either<T, StorageOperationStatus>> elementFetcher, Function<T, Either<T, StorageOperationStatus>> elementAdder, - BiFunction<T, T, Either<T, StorageOperationStatus>> elementUpgrader) { + Function<T, Either<ActionStatus, ResponseFormat>> validator, + Function<T, ImmutablePair<ElementTypeEnum, String>> elementInfoGetter, + Function<String, Either<T, StorageOperationStatus>> elementFetcher, + Function<T, Either<T, StorageOperationStatus>> elementAdder, + BiFunction<T, T, Either<T, StorageOperationStatus>> elementUpgrader) { List<ImmutablePair<T, Boolean>> createdElementTypes = new ArrayList<>(); @@ -279,49 +266,42 @@ public class CommonImportManager { while (elementTypeItr.hasNext()) { T elementType = elementTypeItr.next(); eitherResult = handleType(elementType, validator, elementInfoGetter, elementFetcher, elementAdder, elementUpgrader) - .left() - .map(elem -> append(createdElementTypes, elem)); - + .left() + .map(elem -> append(createdElementTypes, elem)); + if (eitherResult.isRight()) { break; } - - if(!elementTypeItr.hasNext()) { + + if (!elementTypeItr.hasNext()) { log.info("all {} were created successfully!!!", elementType); } } - } - catch(Exception e) { + } catch (Exception e) { eitherResult = Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR)); throw e; - } - finally { + } finally { if (eitherResult.isLeft()) { propertyOperation.getJanusGraphGenericDao().commit(); - } - else { + } else { propertyOperation.getJanusGraphGenericDao().rollback(); } } return eitherResult; } - - private static <T> List<T> append(List<T> list, T value) { - list.add(value); - return list; - } - - - private <T> Either<ImmutablePair<T, Boolean>, ResponseFormat> handleType(T elementType, - Function<T, Either<ActionStatus, ResponseFormat>> validator, Function<T, ImmutablePair<ElementTypeEnum, String>> elementInfoGetter, - Function<String, Either<T, StorageOperationStatus>> elementFetcher, Function<T, Either<T, StorageOperationStatus>> elementAdder, - BiFunction<T, T, Either<T, StorageOperationStatus>> elementUpgrader) { - + + private <T> Either<ImmutablePair<T, Boolean>, ResponseFormat> handleType(T elementType, + Function<T, Either<ActionStatus, ResponseFormat>> validator, + Function<T, ImmutablePair<ElementTypeEnum, String>> elementInfoGetter, + Function<String, Either<T, StorageOperationStatus>> elementFetcher, + Function<T, Either<T, StorageOperationStatus>> elementAdder, + BiFunction<T, T, Either<T, StorageOperationStatus>> elementUpgrader) { + final ImmutablePair<ElementTypeEnum, String> elementInfo = elementInfoGetter.apply(elementType); ElementTypeEnum elementTypeEnum = elementInfo.left; String elementName = elementInfo.right; - + Either<ActionStatus, ResponseFormat> validateElementType = validator.apply(elementType); if (validateElementType.isRight()) { ResponseFormat responseFormat = validateElementType.right().value(); @@ -336,7 +316,8 @@ public class CommonImportManager { StorageOperationStatus status = findElementType.right().value(); log.debug("searched {} finished with result:{}", elementTypeEnum, status); if (status != StorageOperationStatus.NOT_FOUND) { - ResponseFormat responseFormat = getResponseFormatForElementType(convertFromStorageResponseForElementType(status, elementTypeEnum), elementTypeEnum, elementType); + ResponseFormat responseFormat = getResponseFormatForElementType(convertFromStorageResponseForElementType(status, elementTypeEnum), + elementTypeEnum, elementType); return Either.right(responseFormat); } else { return addElementType(elementType, elementAdder, elementTypeEnum, elementName); @@ -356,15 +337,18 @@ public class CommonImportManager { } } - private <T> Either<ImmutablePair<T, Boolean>, ResponseFormat> addElementType(T elementType, Function<T, Either<T, StorageOperationStatus>> elementAdder, ElementTypeEnum elementTypeEnum, String elementName) { + private <T> Either<ImmutablePair<T, Boolean>, ResponseFormat> addElementType(T elementType, + Function<T, Either<T, StorageOperationStatus>> elementAdder, + ElementTypeEnum elementTypeEnum, String elementName) { Either<T, StorageOperationStatus> dataModelResponse = elementAdder.apply(elementType); - + if (dataModelResponse.isRight()) { BeEcompErrorManager.getInstance().logBeFailedAddingNodeTypeError("Create {}", elementTypeEnum.name()); log.debug("failed to create {}: {}", elementTypeEnum, elementName); if (dataModelResponse.right().value() != StorageOperationStatus.OK) { - ResponseFormat responseFormat = getResponseFormatForElementType(convertFromStorageResponseForElementType(dataModelResponse.right().value(), elementTypeEnum), elementTypeEnum, elementType); - + ResponseFormat responseFormat = getResponseFormatForElementType( + convertFromStorageResponseForElementType(dataModelResponse.right().value(), elementTypeEnum), elementTypeEnum, elementType); + return Either.right(responseFormat); } else { return Either.left(new ImmutablePair<>(elementType, false)); @@ -374,17 +358,19 @@ public class CommonImportManager { return Either.left(new ImmutablePair<>(elementType, true)); } } - - - private <T> Either<ImmutablePair<T, Boolean>, ResponseFormat> updateElementType(T elementType, BiFunction<T, T, Either<T, StorageOperationStatus>> elementUpgrader, - ElementTypeEnum elementTypeEnum, String elementName, T existingElementType) { + + private <T> Either<ImmutablePair<T, Boolean>, ResponseFormat> updateElementType(T elementType, + BiFunction<T, T, Either<T, StorageOperationStatus>> elementUpgrader, + ElementTypeEnum elementTypeEnum, String elementName, + T existingElementType) { Either<T, StorageOperationStatus> upgradeResponse = elementUpgrader.apply(elementType, existingElementType); if (upgradeResponse.isRight()) { StorageOperationStatus status = upgradeResponse.right().value(); if (status == StorageOperationStatus.OK) { return Either.left(new ImmutablePair<>(elementType, false)); } else { - ResponseFormat responseFormat = getResponseFormatForElementType(convertFromStorageResponseForElementType(upgradeResponse.right().value(), elementTypeEnum), elementTypeEnum, elementType); + ResponseFormat responseFormat = getResponseFormatForElementType( + convertFromStorageResponseForElementType(upgradeResponse.right().value(), elementTypeEnum), elementTypeEnum, elementType); return Either.right(responseFormat); } } else { @@ -393,34 +379,35 @@ public class CommonImportManager { } } - - public <T extends ToscaTypeDataDefinition> Either<List<ImmutablePair<T, Boolean>>, ResponseFormat> createElementTypes(ToscaTypeImportData toscaTypeImportData, Function<String, Either<List<T>, ActionStatus>> elementTypeFromYmlCreater, - Function<List<T>, Either<List<ImmutablePair<T, Boolean>>, ResponseFormat>> elementTypeDaoCreater) { + public <T extends ToscaTypeDataDefinition> Either<List<ImmutablePair<T, Boolean>>, ResponseFormat> createElementTypes( + ToscaTypeImportData toscaTypeImportData, Function<String, Either<List<T>, ActionStatus>> elementTypeFromYmlCreater, + Function<List<T>, Either<List<ImmutablePair<T, Boolean>>, ResponseFormat>> elementTypeDaoCreater) { Either<List<T>, ActionStatus> elementTypes = elementTypeFromYmlCreater.apply(toscaTypeImportData.getToscaTypesYml()); return elementTypes - .right() - .map(err -> componentsUtils.getResponseFormat(err, "")) - .left() - .map(toscaTypes -> enrichTypesWithNonToscaMetadata(toscaTypes, toscaTypeImportData.getToscaTypeMetadata())) - .left() - .bind(elementTypeDaoCreater::apply); + .right() + .map(err -> componentsUtils.getResponseFormat(err, "")) + .left() + .map(toscaTypes -> enrichTypesWithNonToscaMetadata(toscaTypes, toscaTypeImportData.getToscaTypeMetadata())) + .left() + .bind(elementTypeDaoCreater::apply); } public <T extends ToscaDataDefinition> List<ImmutablePair<T, Boolean>> createElementTypes(String toscaTypesYml, BiFunction<String, Map<String, Object>, T> createApi, TypeOperations<T> typeOperations) { Map<String, Object> fieldMap = convertToFieldMap(toscaTypesYml); - if (fieldMap==null) { + if (fieldMap == null) { throw new ByActionStatusComponentException(ActionStatus.INVALID_YAML_FILE); } List<T> elementTypes = createTypesFromToscaJsonMap(createApi, fieldMap); return createTypesByDao(elementTypes, typeOperations); } - private <T extends ToscaTypeDataDefinition> List<T> enrichTypesWithNonToscaMetadata(List<T> toscaTypes, Map<String, ToscaTypeMetadata> toscaTypeMetadata) { + private <T extends ToscaTypeDataDefinition> List<T> enrichTypesWithNonToscaMetadata(List<T> toscaTypes, + Map<String, ToscaTypeMetadata> toscaTypeMetadata) { return toscaTypes.stream() - .map(toscaType -> setNonToscaMetaDataOnType(toscaTypeMetadata, toscaType)) - .collect(toList()); + .map(toscaType -> setNonToscaMetaDataOnType(toscaTypeMetadata, toscaType)) + .collect(toList()); } private <T extends ToscaTypeDataDefinition> T setNonToscaMetaDataOnType(Map<String, ToscaTypeMetadata> toscaTypeMetadata, T toscaTypeDefinition) { @@ -435,8 +422,10 @@ public class CommonImportManager { return toscaTypeDefinition; } - public <T> Either<List<ImmutablePair<T, Boolean>>, ResponseFormat> createElementTypes(String elementTypesYml, Function<String, Either<List<T>, ActionStatus>> elementTypeFromYmlCreater, - Function<List<T>, Either<List<ImmutablePair<T, Boolean>>, ResponseFormat>> elementTypeDaoCreater, ElementTypeEnum elementTypeEnum) { + public <T> Either<List<ImmutablePair<T, Boolean>>, ResponseFormat> createElementTypes(String elementTypesYml, + Function<String, Either<List<T>, ActionStatus>> elementTypeFromYmlCreater, + Function<List<T>, Either<List<ImmutablePair<T, Boolean>>, ResponseFormat>> elementTypeDaoCreater, + ElementTypeEnum elementTypeEnum) { Either<List<T>, ActionStatus> elementTypes = elementTypeFromYmlCreater.apply(elementTypesYml); if (elementTypes.isRight()) { @@ -447,4 +436,13 @@ public class CommonImportManager { return elementTypeDaoCreater.apply(elementTypes.left().value()); } + + public enum ElementTypeEnum { + POLICY_TYPE, GROUP_TYPE, DATA_TYPE, CAPABILITY_TYPE, INTERFACE_LIFECYCLE_TYPE, RELATIONSHIP_TYPE + } + + public interface ICreateElementType<T1, T2, T3> { + + T3 createElement(T1 firstArg, T2 secondArg); + } } |