Validate model exists when associating types
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / impl / CapabilityTypeImportManager.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20 package org.openecomp.sdc.be.components.impl;
21
22 import fj.data.Either;
23 import java.util.List;
24 import java.util.Map;
25 import java.util.Optional;
26 import org.apache.commons.lang3.StringUtils;
27 import org.apache.commons.lang3.tuple.ImmutablePair;
28 import org.openecomp.sdc.be.dao.api.ActionStatus;
29 import org.openecomp.sdc.be.model.CapabilityTypeDefinition;
30 import org.openecomp.sdc.be.model.Model;
31 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
32 import org.openecomp.sdc.be.model.operations.impl.CapabilityTypeOperation;
33 import org.openecomp.sdc.be.model.operations.impl.ModelOperation;
34 import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
35 import org.openecomp.sdc.be.model.utils.TypeCompareUtils;
36 import org.openecomp.sdc.be.utils.TypeUtils;
37 import org.openecomp.sdc.common.log.wrappers.Logger;
38 import org.openecomp.sdc.exception.ResponseFormat;
39 import org.springframework.beans.factory.annotation.Autowired;
40 import org.springframework.stereotype.Component;
41
42 @Component("capabilityTypeImportManager")
43 public class CapabilityTypeImportManager {
44
45     private static final Logger log = Logger.getLogger(CapabilityTypeImportManager.class.getName());
46     private final CapabilityTypeOperation capabilityTypeOperation;
47     private final CommonImportManager commonImportManager;
48     private final ModelOperation modelOperation;
49
50     @Autowired
51     public CapabilityTypeImportManager(CapabilityTypeOperation capabilityTypeOperation, CommonImportManager commonImportManager, ModelOperation modelOperation) {
52         this.capabilityTypeOperation = capabilityTypeOperation;
53         this.commonImportManager = commonImportManager;
54         this.modelOperation = modelOperation;
55     }
56
57     public Either<List<ImmutablePair<CapabilityTypeDefinition, Boolean>>, ResponseFormat> createCapabilityTypes(final String capabilityTypesYml, final String modelName) {
58         return commonImportManager.createElementTypes(capabilityTypesYml, capabilityTypesFromYml -> createCapabilityTypesFromYml(capabilityTypesYml, modelName), this::upsertCapabilityTypesByDao,
59             CommonImportManager.ElementTypeEnum.CAPABILITY_TYPE);
60     }
61
62     private Either<List<CapabilityTypeDefinition>, ActionStatus> createCapabilityTypesFromYml(final String capabilityTypesYml, final String modelName) {
63         final Either<List<CapabilityTypeDefinition>, ActionStatus> capabilityTypes = commonImportManager.createElementTypesFromYml(capabilityTypesYml, this::createCapabilityType);
64         if (capabilityTypes.isLeft() && StringUtils.isNotEmpty(modelName)){
65             final Optional<Model> modelOptional = modelOperation.findModelByName(modelName);
66             if (modelOptional.isPresent()) {
67                 capabilityTypes.left().value().forEach(capabilityType -> capabilityType.setModel(modelName));
68                 return capabilityTypes;
69             }
70             return Either.right(ActionStatus.INVALID_MODEL);
71         }
72         return capabilityTypes;
73     }
74
75     private Either<List<ImmutablePair<CapabilityTypeDefinition, Boolean>>, ResponseFormat> upsertCapabilityTypesByDao(
76         List<CapabilityTypeDefinition> capabilityTypesToCreate) {
77         return commonImportManager.createElementTypesByDao(capabilityTypesToCreate, capabilityType -> Either.left(ActionStatus.OK),
78             capabilityType -> new ImmutablePair<>(CommonImportManager.ElementTypeEnum.CAPABILITY_TYPE, UniqueIdBuilder.buildCapabilityTypeUid(capabilityType.getModel(), capabilityType.getType())),
79             capabilityTypeOperation::getCapabilityType, capabilityTypeOperation::addCapabilityType, this::updateCapabilityType);
80     }
81
82     private Either<CapabilityTypeDefinition, StorageOperationStatus> updateCapabilityType(CapabilityTypeDefinition newCapabilityType,
83                                                                                           CapabilityTypeDefinition oldCapabilityType) {
84         Either<CapabilityTypeDefinition, StorageOperationStatus> validationRes = capabilityTypeOperation.validateUpdateProperties(newCapabilityType);
85         if (validationRes.isRight()) {
86             log.error("#updateCapabilityType - One or all properties of capability type {} not valid. status is {}", newCapabilityType,
87                 validationRes.right().value());
88             return validationRes;
89         }
90         if (TypeCompareUtils.isCapabilityTypesEquals(newCapabilityType, oldCapabilityType)) {
91             return TypeCompareUtils.typeAlreadyExists();
92         }
93         return capabilityTypeOperation.updateCapabilityType(newCapabilityType, oldCapabilityType);
94     }
95
96     private CapabilityTypeDefinition createCapabilityType(String capabilityTypeName, Map<String, Object> toscaJson) {
97         CapabilityTypeDefinition capabilityType = new CapabilityTypeDefinition();
98         capabilityType.setType(capabilityTypeName);
99         // Description
100         commonImportManager.setField(toscaJson, TypeUtils.ToscaTagNamesEnum.DESCRIPTION.getElementName(), capabilityType::setDescription);
101         // Derived From
102         commonImportManager.setField(toscaJson, TypeUtils.ToscaTagNamesEnum.DERIVED_FROM.getElementName(), capabilityType::setDerivedFrom);
103         // Properties
104         commonImportManager.setPropertiesMap(toscaJson, capabilityType::setProperties);
105         return capabilityType;
106     }
107 }