2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2021 Nordix Foundation. 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
11 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.zone-instance.component.ts
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 * SPDX-License-Identifier: Apache-2.0
19 * ============LICENSE_END=========================================================
22 package org.openecomp.sdc.be.components.impl;
24 import static org.openecomp.sdc.be.components.impl.ImportUtils.Constants.QUOTE;
26 import com.google.common.reflect.TypeToken;
27 import com.google.gson.Gson;
28 import com.google.gson.GsonBuilder;
29 import fj.data.Either;
30 import java.lang.reflect.Type;
31 import java.util.ArrayList;
32 import java.util.Arrays;
33 import java.util.HashMap;
34 import java.util.List;
36 import java.util.Optional;
37 import java.util.UUID;
38 import java.util.stream.Collectors;
39 import org.apache.commons.collections.CollectionUtils;
40 import org.apache.commons.collections.MapUtils;
41 import org.openecomp.sdc.be.components.impl.exceptions.BusinessLogicException;
42 import org.openecomp.sdc.be.components.validation.ComponentValidations;
43 import org.openecomp.sdc.be.dao.api.ActionStatus;
44 import org.openecomp.sdc.be.datamodel.utils.PropertyValueConstraintValidationUtil;
45 import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
46 import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition;
47 import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
48 import org.openecomp.sdc.be.datatypes.elements.OperationInputDefinition;
49 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
50 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
51 import org.openecomp.sdc.be.model.ArtifactTypeDefinition;
52 import org.openecomp.sdc.be.model.Component;
53 import org.openecomp.sdc.be.model.ComponentInstance;
54 import org.openecomp.sdc.be.model.ComponentInstanceInterface;
55 import org.openecomp.sdc.be.model.ComponentParametersView;
56 import org.openecomp.sdc.be.model.InterfaceDefinition;
57 import org.openecomp.sdc.be.model.PropertyConstraint;
58 import org.openecomp.sdc.be.model.PropertyDefinition;
59 import org.openecomp.sdc.be.model.User;
60 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
61 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
62 import org.openecomp.sdc.be.model.operations.api.IElementOperation;
63 import org.openecomp.sdc.be.model.operations.api.IGroupInstanceOperation;
64 import org.openecomp.sdc.be.model.operations.api.IGroupOperation;
65 import org.openecomp.sdc.be.model.operations.api.IGroupTypeOperation;
66 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
67 import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation;
68 import org.openecomp.sdc.be.model.operations.impl.PropertyOperation;
69 import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
70 import org.openecomp.sdc.be.tosca.utils.OperationArtifactUtil;
71 import org.openecomp.sdc.be.user.Role;
72 import org.openecomp.sdc.common.datastructure.Wrapper;
73 import org.openecomp.sdc.exception.ResponseFormat;
74 import org.slf4j.Logger;
75 import org.slf4j.LoggerFactory;
76 import org.springframework.beans.factory.annotation.Autowired;
78 @org.springframework.stereotype.Component("componentInterfaceOperationBusinessLogic")
79 public class ComponentInterfaceOperationBusinessLogic extends BaseBusinessLogic {
81 private static final Logger LOGGER = LoggerFactory.getLogger(ComponentInterfaceOperationBusinessLogic.class);
82 private static final String UPDATE_INTERFACE_OPERATION_ON_COMPONENT_INSTANCE =
83 "Update Interface Operation on Component instance";
84 private static final String EXCEPTION_OCCURRED_WHEN_UPDATING_COMPONENT_INSTANCE_INTERFACES =
85 "Exception occurred when updating Component Instance Interfaces {}";
86 private final ComponentValidations componentValidations;
87 private final PropertyBusinessLogic propertyBusinessLogic;
88 private final ArtifactTypeBusinessLogic artifactTypeBusinessLogic;
91 public ComponentInterfaceOperationBusinessLogic(final IElementOperation elementDao, final IGroupOperation groupOperation,
92 final IGroupInstanceOperation groupInstanceOperation,
93 final IGroupTypeOperation groupTypeOperation, final InterfaceOperation interfaceOperation,
94 final InterfaceLifecycleOperation interfaceLifecycleTypeOperation,
95 final ArtifactsOperations artifactToscaOperation,
96 final ComponentValidations componentValidations,
97 final PropertyBusinessLogic propertyBusinessLogic,
98 final ArtifactTypeBusinessLogic artifactTypeBusinessLogic) {
99 super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, interfaceOperation, interfaceLifecycleTypeOperation,
100 artifactToscaOperation);
101 this.componentValidations = componentValidations;
102 this.propertyBusinessLogic = propertyBusinessLogic;
103 this.artifactTypeBusinessLogic = artifactTypeBusinessLogic;
106 public Optional<ComponentInstance> updateComponentInstanceInterfaceOperation(final String componentId, final String componentInstanceId,
107 final InterfaceDefinition interfaceDefinition,
108 final ComponentTypeEnum componentTypeEnum,
109 final Wrapper<ResponseFormat> errorWrapper, final boolean shouldLock)
110 throws BusinessLogicException {
111 final Component component = getComponent(componentId);
112 final Optional<ComponentInstance> componentInstanceOptional = componentValidations.getComponentInstance(component, componentInstanceId);
113 ResponseFormat responseFormat;
114 if (componentInstanceOptional.isEmpty()) {
115 responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND);
116 LOGGER.debug("Failed to found component instance with id {}, error: {}", componentInstanceId, responseFormat);
117 errorWrapper.setInnerElement(responseFormat);
118 return Optional.empty();
120 Map<String, List<ComponentInstanceInterface>> componentInstancesInterfaceMap = component.getComponentInstancesInterfaces();
121 if (MapUtils.isEmpty(componentInstancesInterfaceMap)) {
122 componentInstancesInterfaceMap = new HashMap<>();
123 component.setComponentInstancesInterfaces(componentInstancesInterfaceMap);
125 final List<ComponentInstanceInterface> componentInstanceInterfaceList = componentInstancesInterfaceMap.get(componentInstanceId);
126 if (CollectionUtils.isEmpty(componentInstanceInterfaceList)) {
127 responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND);
128 LOGGER.debug("Failed to found component instance with id {}, error: {}", componentInstanceId, responseFormat);
129 errorWrapper.setInnerElement(responseFormat);
130 return Optional.empty();
132 final Optional<OperationDataDefinition> optionalOperationDataDefinition = interfaceDefinition.getOperations().values().stream().findFirst();
133 if (optionalOperationDataDefinition.isEmpty()) {
134 responseFormat = componentsUtils.getResponseFormat(ActionStatus.INTERFACE_OPERATION_NOT_FOUND);
135 LOGGER.debug("Failed to found interface operation on component instance with id {}, error: {}", componentInstanceId, responseFormat);
136 errorWrapper.setInnerElement(responseFormat);
137 return Optional.empty();
139 final OperationDataDefinition updatedOperationDataDefinition = optionalOperationDataDefinition.get();
140 final Optional<ComponentInstanceInterface> optionalComponentInstanceInterface = componentInstanceInterfaceList.stream().filter(
141 ci -> ci.getOperations().values().stream().anyMatch(
142 operationDataDefinition -> operationDataDefinition.getUniqueId().equalsIgnoreCase(updatedOperationDataDefinition.getUniqueId())))
144 if (optionalComponentInstanceInterface.isEmpty()) {
145 responseFormat = componentsUtils.getResponseFormat(ActionStatus.INTERFACE_NOT_FOUND_IN_COMPONENT);
147 .debug("Failed to found ComponentInstanceInterface on component instance with id {}, error: {}", componentInstanceId, responseFormat);
148 errorWrapper.setInnerElement(responseFormat);
149 return Optional.empty();
152 final String model = propertyBusinessLogic.getComponentModelByComponentId(componentId);
153 PropertyValueConstraintValidationUtil constraintValidatorUtil = new PropertyValueConstraintValidationUtil();
154 Either<Boolean, ResponseFormat> constraintValidatorResponse =
155 validateOperationInputConstraints(updatedOperationDataDefinition, constraintValidatorUtil, model);
156 if (!isConstraintsValidationSucceed(constraintValidatorResponse, errorWrapper, updatedOperationDataDefinition)) {
157 return Optional.empty();
159 constraintValidatorResponse = validateOperationArtifactPropertyConstraints(
160 updatedOperationDataDefinition, constraintValidatorUtil, model);
161 if (!isConstraintsValidationSucceed(constraintValidatorResponse, errorWrapper, updatedOperationDataDefinition)) {
162 return Optional.empty();
165 updateOperationDefinitionImplementation(updatedOperationDataDefinition);
166 optionalComponentInstanceInterface.get().getOperations().replace(updatedOperationDataDefinition.getName(), updatedOperationDataDefinition);
167 boolean wasLocked = false;
170 lockComponent(componentId, component, UPDATE_INTERFACE_OPERATION_ON_COMPONENT_INSTANCE);
173 final StorageOperationStatus status = toscaOperationFacade.updateComponentInstanceInterfaces(component, componentInstanceId);
174 if (status != StorageOperationStatus.OK) {
175 janusGraphDao.rollback();
176 responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
177 LOGGER.error(EXCEPTION_OCCURRED_WHEN_UPDATING_COMPONENT_INSTANCE_INTERFACES, responseFormat);
178 errorWrapper.setInnerElement(responseFormat);
179 return Optional.empty();
181 final ComponentParametersView componentFilter = new ComponentParametersView();
182 componentFilter.disableAll();
183 componentFilter.setIgnoreUsers(false);
184 componentFilter.setIgnoreComponentInstances(false);
185 componentFilter.setIgnoreInterfaces(false);
186 componentFilter.setIgnoreComponentInstancesInterfaces(false);
187 final Either<Component, StorageOperationStatus> operationStatusEither = toscaOperationFacade
188 .updateComponentInstanceMetadataOfTopologyTemplate(component, componentFilter);
189 if (operationStatusEither.isRight()) {
190 janusGraphDao.rollback();
191 responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
192 LOGGER.error("Exception occurred when updating Component Instance Topology template {}", responseFormat);
193 errorWrapper.setInnerElement(responseFormat);
194 return Optional.empty();
196 janusGraphDao.commit();
197 } catch (final Exception e) {
198 janusGraphDao.rollback();
199 LOGGER.error("Exception occurred when updating Interface Operation on Component Instance: {}", e.getMessage(), e);
200 responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
201 errorWrapper.setInnerElement(responseFormat);
202 throw new BusinessLogicException(responseFormat);
205 unlockComponent(component.getUniqueId(), componentTypeEnum);
208 return componentInstanceOptional;
211 private Either<Boolean, ResponseFormat> validateOperationInputConstraints(
212 OperationDataDefinition operationDataDefinition, PropertyValueConstraintValidationUtil constraintValidatorUtil, String model) {
213 return constraintValidatorUtil
214 .validatePropertyConstraints(convertOperationInputsToPropertyDefinitions(operationDataDefinition), applicationDataTypeCache,
218 private Either<Boolean, ResponseFormat> validateOperationArtifactPropertyConstraints(
219 OperationDataDefinition operationDataDefinition, PropertyValueConstraintValidationUtil constraintValidatorUtil, String model) {
220 return constraintValidatorUtil
221 .validatePropertyConstraints(convertOperationArtifactPropsToPropertyDefinitions(operationDataDefinition, model), applicationDataTypeCache,
225 private boolean isConstraintsValidationSucceed(Either<Boolean, ResponseFormat> constraintValidatorResponse,
226 Wrapper<ResponseFormat> errorWrapper,
227 OperationDataDefinition updatedOperationDataDefinition) {
228 if (constraintValidatorResponse.isRight()) {
229 ResponseFormat responseFormat = constraintValidatorResponse.right().value();
230 LOGGER.error("Failed constraints validation on inputs for interface operation: {} - {}",
231 updatedOperationDataDefinition.getName(),
232 constraintValidatorResponse.right().value());
233 errorWrapper.setInnerElement(responseFormat);
239 public Optional<Component> updateResourceInterfaceOperation(final String componentId,
241 final InterfaceDefinition interfaceDefinition,
242 final ComponentTypeEnum componentTypeEnum,
243 final Wrapper<ResponseFormat> errorWrapper,
244 final boolean shouldLock) throws BusinessLogicException {
245 final var component = getComponent(componentId);
246 validateCanWorkOnComponent(component, user);
247 ResponseFormat responseFormat;
249 Map<String, InterfaceDefinition> componentInterfaceMap = component.getInterfaces();
250 final String interfaceDefinitionType = interfaceDefinition.getType();
251 if (MapUtils.isEmpty(componentInterfaceMap)) {
252 componentInterfaceMap = new HashMap<>();
253 componentInterfaceMap.put(interfaceDefinitionType, interfaceDefinition);
254 component.setInterfaces(componentInterfaceMap);
256 InterfaceDefinition componentInterfaceDefinition = componentInterfaceMap.get(interfaceDefinitionType);
257 if (componentInterfaceDefinition == null) {
258 componentInterfaceDefinition = interfaceDefinition;
259 componentInterfaceMap.put(interfaceDefinitionType, interfaceDefinition);
262 final Map<String, OperationDataDefinition> interfaceDefinitionOperations = interfaceDefinition.getOperations();
263 final Optional<OperationDataDefinition> optionalOperationDataDefinition = interfaceDefinitionOperations.values().stream().findFirst();
264 if (optionalOperationDataDefinition.isEmpty()) {
265 responseFormat = componentsUtils.getResponseFormat(ActionStatus.INTERFACE_OPERATION_NOT_FOUND);
266 LOGGER.debug("Failed to found interface operation on provided InterfaceDefinition {}, error: {}",
267 interfaceDefinitionType, responseFormat);
268 errorWrapper.setInnerElement(responseFormat);
269 return Optional.empty();
271 final var updatedOperationDataDefinition = optionalOperationDataDefinition.get();
272 updateOperationDefinitionImplementation(updatedOperationDataDefinition);
273 Map<String, OperationDataDefinition> componentOperationDataDefinitionMap = componentInterfaceDefinition.getOperations();
274 if (MapUtils.isEmpty(componentOperationDataDefinitionMap)) {
275 componentOperationDataDefinitionMap = new HashMap<>();
276 componentInterfaceDefinition.setOperations(componentOperationDataDefinitionMap);
278 componentOperationDataDefinitionMap.replace(updatedOperationDataDefinition.getName(), updatedOperationDataDefinition);
280 boolean wasLocked = false;
283 lockComponent(componentId, component, UPDATE_INTERFACE_OPERATION_ON_COMPONENT_INSTANCE);
286 final StorageOperationStatus status = toscaOperationFacade.updateComponentInterfaces(component, interfaceDefinitionType);
287 if (status != StorageOperationStatus.OK) {
288 janusGraphDao.rollback();
289 responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
290 LOGGER.error(EXCEPTION_OCCURRED_WHEN_UPDATING_COMPONENT_INSTANCE_INTERFACES, responseFormat);
291 errorWrapper.setInnerElement(responseFormat);
292 return Optional.empty();
294 janusGraphDao.commit();
295 } catch (final Exception e) {
296 janusGraphDao.rollback();
297 LOGGER.error("Exception occurred when updating Interface Operation on Component Instance: ", e);
298 responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
299 errorWrapper.setInnerElement(responseFormat);
300 throw new BusinessLogicException(responseFormat);
303 unlockComponent(component.getUniqueId(), componentTypeEnum);
306 return Optional.of(component);
309 public Optional<Component> createInterfaceOperationInResource(final String componentId, final InterfaceDefinition interfaceDefinition,
310 final ComponentTypeEnum componentTypeEnum,
311 final Wrapper<ResponseFormat> errorWrapper, final boolean shouldLock)
312 throws BusinessLogicException {
313 final Component component = getComponent(componentId);
314 ResponseFormat responseFormat;
315 final String componentInterfaceUpdatedKey = interfaceDefinition.getType();
317 Map<String, InterfaceDefinition> componentInterfaceMap = component.getInterfaces();
318 if (MapUtils.isEmpty(componentInterfaceMap)) {
319 componentInterfaceMap = new HashMap<>();
320 component.setInterfaces(componentInterfaceMap);
323 interfaceDefinition.setUniqueId(componentInterfaceUpdatedKey);
324 interfaceDefinition.setToscaResourceName(componentInterfaceUpdatedKey);
325 interfaceDefinition.setUserCreated(true);
327 final Optional<OperationDataDefinition> optionalOperationDataDefinition = interfaceDefinition.getOperations().values().stream().findFirst();
328 if (optionalOperationDataDefinition.isEmpty()) {
329 responseFormat = componentsUtils.getResponseFormat(ActionStatus.INTERFACE_OPERATION_NOT_FOUND);
330 LOGGER.debug("Failed to found interface operation on component instance with id {}, error: {}", componentId, responseFormat);
331 errorWrapper.setInnerElement(responseFormat);
332 return Optional.empty();
335 final OperationDataDefinition updatedOperationDataDefinition = optionalOperationDataDefinition.get();
336 updatedOperationDataDefinition.setUniqueId(UUID.randomUUID().toString());
337 updatedOperationDataDefinition.getImplementation()
338 .setArtifactName(generateArtifactName(updatedOperationDataDefinition.getImplementation().getArtifactName()));
340 final InterfaceDefinition interfaceDefinitionFound = componentInterfaceMap.get(componentInterfaceUpdatedKey);
341 if (interfaceDefinitionFound != null) {
342 final Map<String, OperationDataDefinition> operationsFromComponent = interfaceDefinitionFound.getOperations();
343 final String updatedOperationDataDefinitionName = updatedOperationDataDefinition.getName();
344 final boolean find = operationsFromComponent.containsKey(updatedOperationDataDefinitionName);
346 responseFormat = componentsUtils.getResponseFormat(ActionStatus.INTERFACE_OPERATION_NAME_ALREADY_IN_USE,
347 updatedOperationDataDefinitionName);
348 LOGGER.error("Operation '{}' for Interface '{}' already exist, error: '{}'", updatedOperationDataDefinitionName,
349 componentInterfaceUpdatedKey, responseFormat);
350 errorWrapper.setInnerElement(responseFormat);
351 return Optional.empty();
353 operationsFromComponent.put(updatedOperationDataDefinitionName, updatedOperationDataDefinition);
354 interfaceDefinition.setOperations(operationsFromComponent);
358 componentInterfaceMap.put(componentInterfaceUpdatedKey, interfaceDefinition);
360 boolean wasLocked = false;
363 lockComponent(componentId, component, UPDATE_INTERFACE_OPERATION_ON_COMPONENT_INSTANCE);
366 final Either<InterfaceDefinition, StorageOperationStatus> operationStatusEither =
367 toscaOperationFacade.addInterfaceToComponent(componentInterfaceUpdatedKey, interfaceDefinition, component);
368 if (operationStatusEither.isRight()) {
369 janusGraphDao.rollback();
370 responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
371 LOGGER.error(EXCEPTION_OCCURRED_WHEN_UPDATING_COMPONENT_INSTANCE_INTERFACES, responseFormat);
372 errorWrapper.setInnerElement(responseFormat);
373 return Optional.empty();
375 janusGraphDao.commit();
376 } catch (final Exception e) {
377 janusGraphDao.rollback();
378 LOGGER.error("Exception occurred when updating Interface Operation on Component Instance: ", e);
379 responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
380 errorWrapper.setInnerElement(responseFormat);
381 throw new BusinessLogicException(responseFormat);
384 unlockComponent(component.getUniqueId(), componentTypeEnum);
387 return Optional.of(component);
390 private String generateArtifactName(final String name) {
391 if (OperationArtifactUtil.artifactNameIsALiteralValue(name)) {
394 return QUOTE + name + QUOTE;
398 public User validateUser(final String userId) {
399 final User user = userValidations.validateUserExists(userId);
400 userValidations.validateUserRole(user, Arrays.asList(Role.DESIGNER, Role.ADMIN));
404 private void unlockComponent(final String componentUniqueId, final ComponentTypeEnum componentType) {
405 graphLockOperation.unlockComponent(componentUniqueId, componentType.getNodeType());
408 private void updateOperationDefinitionImplementation(final OperationDataDefinition updatedOperationDataDefinition) {
409 final ArtifactDataDefinition artifactInfo = new ArtifactDataDefinition(updatedOperationDataDefinition.getImplementation());
410 artifactInfo.setArtifactName(String.format("'%s'", updatedOperationDataDefinition.getImplementation().getArtifactName()));
411 updatedOperationDataDefinition.setImplementation(artifactInfo);
414 private List<PropertyDefinition> convertOperationInputsToPropertyDefinitions(final OperationDataDefinition operationDataDefinition) {
415 List<PropertyDefinition> propertyDefinitions = new ArrayList<>();
416 ListDataDefinition<OperationInputDefinition> inputsDefinitionListData = operationDataDefinition.getInputs();
417 if (null != inputsDefinitionListData && !inputsDefinitionListData.isEmpty()) {
418 List<OperationInputDefinition> inputDefinitionList =
419 inputsDefinitionListData.getListToscaDataDefinition();
420 for (OperationInputDefinition operationInputDefinition : inputDefinitionList) {
421 PropertyDefinition propertyDefinition = new PropertyDefinition();
422 propertyDefinition.setValue(operationInputDefinition.getValue());
423 propertyDefinition.setUniqueId(operationInputDefinition.getUniqueId());
424 propertyDefinition.setType(operationInputDefinition.getType());
425 propertyDefinition.setName(operationInputDefinition.getName());
426 propertyDefinition.setDefaultValue(operationInputDefinition.getDefaultValue());
427 propertyDefinition.setInputPath(operationInputDefinition.getInputPath());
428 propertyDefinitions.add(propertyDefinition);
431 return propertyDefinitions;
434 private List<PropertyDefinition> convertOperationArtifactPropsToPropertyDefinitions(final OperationDataDefinition operationDataDefinition,
435 final String model) {
436 List<PropertyDefinition> artifactPropertiesToValidateCollection = new ArrayList<>();
437 final ArtifactDataDefinition artifactDataDefinition = operationDataDefinition.getImplementation();
438 if (null != artifactDataDefinition) {
439 final String artifactType = artifactDataDefinition.getArtifactType();
440 final String uniqueId = UniqueIdBuilder.buildArtifactTypeUid(model, artifactType);
441 ArtifactTypeDefinition retrievedArtifact = artifactTypeBusinessLogic.getArtifactTypeByUid(uniqueId);
442 if (retrievedArtifact != null) {
443 List<PropertyDataDefinition> artifactPropertiesList = artifactDataDefinition.getProperties();
444 if (null != artifactPropertiesList && !artifactPropertiesList.isEmpty()) {
445 for (PropertyDataDefinition propertyDataDefinition : artifactPropertiesList) {
446 PropertyDefinition propertyDefinition = new PropertyDefinition();
447 propertyDefinition.setConstraints(deserializePropertyConstraints(propertyDataDefinition.getPropertyConstraints()));
448 propertyDefinition.setValue(propertyDataDefinition.getValue());
449 propertyDefinition.setType(propertyDataDefinition.getType());
450 propertyDefinition.setName(propertyDataDefinition.getName());
451 propertyDefinition.setDefaultValue(propertyDataDefinition.getDefaultValue());
452 propertyDefinition.setInputPath(propertyDataDefinition.getInputPath());
453 artifactPropertiesToValidateCollection.add(propertyDefinition);
458 return artifactPropertiesToValidateCollection;
461 private List<PropertyConstraint> deserializePropertyConstraints(List<String> constraints) {
462 if (CollectionUtils.isNotEmpty(constraints)) {
463 Type constraintType = new TypeToken<PropertyConstraint>() {
465 Gson gson = new GsonBuilder().registerTypeAdapter(constraintType, new PropertyOperation.PropertyConstraintDeserialiser()).create();
466 return constraints.stream().map(c -> (PropertyConstraint) gson.fromJson(c, constraintType)).collect(
467 Collectors.toList());