2 * ============LICENSE_START=======================================================
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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 * Modifications copyright (c) 2019 Nokia
20 * ================================================================================
22 package org.openecomp.sdc.be.components.impl;
24 import fj.data.Either;
25 import java.util.ArrayList;
26 import java.util.HashMap;
27 import java.util.List;
29 import java.util.Map.Entry;
30 import java.util.Optional;
31 import java.util.function.BiFunction;
32 import java.util.function.BooleanSupplier;
33 import java.util.stream.Collectors;
34 import org.apache.commons.collections.CollectionUtils;
35 import org.apache.commons.lang3.StringUtils;
36 import org.apache.commons.lang3.tuple.ImmutablePair;
37 import org.openecomp.sdc.be.catalog.enums.ChangeTypeEnum;
38 import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
39 import org.openecomp.sdc.be.components.impl.exceptions.ByResponseFormatComponentException;
40 import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
41 import org.openecomp.sdc.be.components.impl.generic.GenericTypeBusinessLogic;
42 import org.openecomp.sdc.be.components.validation.component.ComponentContactIdValidator;
43 import org.openecomp.sdc.be.components.validation.component.ComponentDescriptionValidator;
44 import org.openecomp.sdc.be.components.validation.component.ComponentIconValidator;
45 import org.openecomp.sdc.be.components.validation.component.ComponentNameValidator;
46 import org.openecomp.sdc.be.components.validation.component.ComponentProjectCodeValidator;
47 import org.openecomp.sdc.be.components.validation.component.ComponentTagsValidator;
48 import org.openecomp.sdc.be.components.validation.component.ComponentValidator;
49 import org.openecomp.sdc.be.config.BeEcompErrorManager;
50 import org.openecomp.sdc.be.config.ConfigurationManager;
51 import org.openecomp.sdc.be.dao.api.ActionStatus;
52 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
53 import org.openecomp.sdc.be.dao.utils.MapUtil;
54 import org.openecomp.sdc.be.datamodel.api.HighestFilterEnum;
55 import org.openecomp.sdc.be.datatypes.components.ServiceMetadataDataDefinition;
56 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
57 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
58 import org.openecomp.sdc.be.datatypes.enums.FilterKeyEnum;
59 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
60 import org.openecomp.sdc.be.datatypes.enums.OriginTypeEnum;
61 import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition;
62 import org.openecomp.sdc.be.facade.operations.CatalogOperation;
63 import org.openecomp.sdc.be.impl.ComponentsUtils;
64 import org.openecomp.sdc.be.model.ArtifactDefinition;
65 import org.openecomp.sdc.be.model.AttributeDefinition;
66 import org.openecomp.sdc.be.model.CapReqDef;
67 import org.openecomp.sdc.be.model.Component;
68 import org.openecomp.sdc.be.model.ComponentInstance;
69 import org.openecomp.sdc.be.model.ComponentInstanceInput;
70 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
71 import org.openecomp.sdc.be.model.ComponentParametersView;
72 import org.openecomp.sdc.be.model.DataTypeDefinition;
73 import org.openecomp.sdc.be.model.GroupDefinition;
74 import org.openecomp.sdc.be.model.IComponentInstanceConnectedElement;
75 import org.openecomp.sdc.be.model.InputDefinition;
76 import org.openecomp.sdc.be.model.LifecycleStateEnum;
77 import org.openecomp.sdc.be.model.Operation;
78 import org.openecomp.sdc.be.model.PropertyDefinition;
79 import org.openecomp.sdc.be.model.Resource;
80 import org.openecomp.sdc.be.model.User;
81 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
82 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
83 import org.openecomp.sdc.be.model.operations.api.IElementOperation;
84 import org.openecomp.sdc.be.model.operations.api.IGroupInstanceOperation;
85 import org.openecomp.sdc.be.model.operations.api.IGroupOperation;
86 import org.openecomp.sdc.be.model.operations.api.IGroupTypeOperation;
87 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
88 import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation;
89 import org.openecomp.sdc.be.model.tosca.ToscaPropertyType;
90 import org.openecomp.sdc.be.resources.data.ComponentMetadataData;
91 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
92 import org.openecomp.sdc.be.resources.data.auditing.model.ResourceCommonInfo;
93 import org.openecomp.sdc.be.resources.data.auditing.model.ResourceVersionInfo;
94 import org.openecomp.sdc.be.ui.model.UiComponentDataTransfer;
95 import org.openecomp.sdc.be.user.Role;
96 import org.openecomp.sdc.be.utils.CommonBeUtils;
97 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
98 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
99 import org.openecomp.sdc.common.log.wrappers.Logger;
100 import org.openecomp.sdc.common.util.ValidationUtils;
101 import org.openecomp.sdc.exception.ResponseFormat;
102 import org.springframework.beans.factory.annotation.Autowired;
104 public abstract class ComponentBusinessLogic extends BaseBusinessLogic {
106 private static final Logger log = Logger.getLogger(ComponentBusinessLogic.class.getName());
107 protected final GroupBusinessLogic groupBusinessLogic;
108 protected ArtifactsBusinessLogic artifactsBusinessLogic;
109 protected GenericTypeBusinessLogic genericTypeBusinessLogic;
110 protected ComponentDescriptionValidator componentDescriptionValidator;
111 protected ComponentProjectCodeValidator componentProjectCodeValidator;
112 protected CatalogOperation catalogOperations;
113 protected ComponentIconValidator componentIconValidator;
114 protected ComponentTagsValidator componentTagsValidator;
115 protected ComponentNameValidator componentNameValidator;
116 protected ComponentContactIdValidator componentContactIdValidator;
118 public ComponentBusinessLogic(IElementOperation elementDao, IGroupOperation groupOperation, IGroupInstanceOperation groupInstanceOperation,
119 IGroupTypeOperation groupTypeOperation, GroupBusinessLogic groupBusinessLogic,
120 InterfaceOperation interfaceOperation, InterfaceLifecycleOperation interfaceLifecycleTypeOperation,
121 ArtifactsBusinessLogic artifactsBusinessLogic, ArtifactsOperations artifactToscaOperation,
122 ComponentContactIdValidator componentContactIdValidator, ComponentNameValidator componentNameValidator,
123 ComponentTagsValidator componentTagsValidator, ComponentValidator componentValidator,
124 ComponentIconValidator componentIconValidator, ComponentProjectCodeValidator componentProjectCodeValidator,
125 ComponentDescriptionValidator componentDescriptionValidator) {
126 super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, interfaceOperation, interfaceLifecycleTypeOperation,
127 artifactToscaOperation);
128 this.artifactsBusinessLogic = artifactsBusinessLogic;
129 this.groupBusinessLogic = groupBusinessLogic;
130 this.componentContactIdValidator = componentContactIdValidator;
131 this.componentNameValidator = componentNameValidator;
132 this.componentTagsValidator = componentTagsValidator;
133 this.componentIconValidator = componentIconValidator;
134 this.componentProjectCodeValidator = componentProjectCodeValidator;
135 this.componentDescriptionValidator = componentDescriptionValidator;
138 private static Either<ArtifactDefinition, Operation> saveToscaArtifactAndPopulateToscaArtifactsWithResult(Component component,
139 final ComponentsUtils componentsUtils,
140 final ArtifactTypeEnum artifactEnum,
141 final BiFunction<Component, ArtifactDefinition, Either<ArtifactDefinition, Operation>> saveToscaArtifactPayloadFunction) {
142 ArtifactDefinition artifactDefinition = getToscaArtifactByTypeOrThrowException(component, artifactEnum, componentsUtils);
143 Either<ArtifactDefinition, Operation> result = saveToscaArtifactPayloadFunction.apply(component, artifactDefinition);
144 if (result.isLeft()) {
145 ArtifactDefinition def = result.left().value();
146 component.getToscaArtifacts().put(def.getArtifactLabel(), def);
151 private static Optional<ArtifactDefinition> getToscaArtifactByType(final Map<String, ArtifactDefinition> toscaArtifacts,
152 final ArtifactTypeEnum typeEnum) {
153 return toscaArtifacts.values().stream().filter(p -> p.getArtifactType().equals(typeEnum.getType())).findAny();
156 private static ArtifactDefinition getToscaArtifactByTypeOrThrowException(final Component component, final ArtifactTypeEnum typeEnum,
157 final ComponentsUtils componentsUtils) {
158 return Optional.ofNullable(component.getToscaArtifacts()).flatMap(toscaArtifacts -> getToscaArtifactByType(toscaArtifacts, typeEnum))
160 log.debug("Impossible to find a ToscaArtifact with type '{}' for {}", typeEnum.getType(), component);
161 return new ByResponseFormatComponentException(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND, typeEnum.name()));
165 public void setComponentDescriptionValidator(ComponentDescriptionValidator componentDescriptionValidator) {
166 this.componentDescriptionValidator = componentDescriptionValidator;
169 public void setComponentProjectCodeValidator(ComponentProjectCodeValidator componentProjectCodeValidator) {
170 this.componentProjectCodeValidator = componentProjectCodeValidator;
173 public void setComponentIconValidator(ComponentIconValidator componentIconValidator) {
174 this.componentIconValidator = componentIconValidator;
177 public void setComponentContactIdValidator(ComponentContactIdValidator componentContactIdValidator) {
178 this.componentContactIdValidator = componentContactIdValidator;
181 public void setComponentTagsValidator(ComponentTagsValidator componentTagsValidator) {
182 this.componentTagsValidator = componentTagsValidator;
185 public void setComponentNameValidator(ComponentNameValidator componentNameValidator) {
186 this.componentNameValidator = componentNameValidator;
190 public void setGenericTypeBusinessLogic(GenericTypeBusinessLogic genericTypeBusinessLogic) {
191 this.genericTypeBusinessLogic = genericTypeBusinessLogic;
194 public abstract Either<List<String>, ResponseFormat> deleteMarkedComponents();
196 public abstract ComponentInstanceBusinessLogic getComponentInstanceBL();
198 public abstract Either<List<ComponentInstance>, ResponseFormat> getComponentInstancesFilteredByPropertiesAndInputs(String componentId,
203 * @param dataParamsToReturn
206 public abstract Either<UiComponentDataTransfer, ResponseFormat> getUiComponentDataTransferByComponentId(String componentId,
207 List<String> dataParamsToReturn);
209 User validateUser(User user, String ecompErrorContext, Component component, AuditingActionEnum auditAction, boolean inTransaction) {
211 ResponseFormat responseFormat;
213 validateUserNotEmpty(user, ecompErrorContext);
214 validatedUser = validateUserExists(user);
215 } catch (ByActionStatusComponentException e) {
216 if (e.getActionStatus() == ActionStatus.MISSING_INFORMATION) {
217 user.setUserId("UNKNOWN");
219 responseFormat = componentsUtils.getResponseFormat(e.getActionStatus(), e.getParams());
220 componentsUtils.auditComponentAdmin(responseFormat, user, component, auditAction, component.getComponentType());
222 } catch (ByResponseFormatComponentException e) {
223 responseFormat = e.getResponseFormat();
224 componentsUtils.auditComponentAdmin(responseFormat, user, component, auditAction, component.getComponentType());
227 return validatedUser;
230 protected void validateUserRole(User user, Component component, List<Role> roles, AuditingActionEnum auditAction, String comment) {
231 if (roles != null && roles.isEmpty()) {
232 roles.add(Role.ADMIN);
233 roles.add(Role.DESIGNER);
236 validateUserRole(user, roles);
237 } catch (ByActionStatusComponentException e) {
238 ResponseFormat responseFormat = componentsUtils.getResponseFormat(e.getActionStatus(), e.getParams());
239 handleComponentException(component, comment, responseFormat, user, auditAction);
241 } catch (ByResponseFormatComponentException e) {
242 ResponseFormat responseFormat = e.getResponseFormat();
243 handleComponentException(component, comment, responseFormat, user, auditAction);
248 private void handleComponentException(Component component, String comment, ResponseFormat responseFormat, User user,
249 AuditingActionEnum auditAction) {
250 String commentStr = null;
251 String distrStatus = null;
252 ComponentTypeEnum componentType = component.getComponentType();
253 if (componentType == ComponentTypeEnum.SERVICE) {
254 distrStatus = ((ServiceMetadataDataDefinition) component.getComponentMetadataDefinition().getMetadataDataDefinition())
255 .getDistributionStatus();
256 commentStr = comment;
258 componentsUtils.auditComponent(responseFormat, user, component, auditAction, new ResourceCommonInfo(componentType.getValue()),
259 ResourceVersionInfo.newBuilder().distributionStatus(distrStatus).build(),
260 ResourceVersionInfo.newBuilder().distributionStatus(distrStatus).build(), commentStr, null, null);
263 public Either<Boolean, ResponseFormat> validateConformanceLevel(String componentUuid, ComponentTypeEnum componentTypeEnum, String userId) {
264 log.trace("validate conformance level");
265 if (componentTypeEnum != ComponentTypeEnum.SERVICE) {
266 log.error("conformance level validation for non service component, id {}", componentUuid);
267 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT);
268 return Either.right(errorResponse);
270 validateUserExists(userId);
271 Either<ComponentMetadataData, StorageOperationStatus> eitherComponent = toscaOperationFacade
272 .getLatestComponentMetadataByUuid(componentUuid, JsonParseFlagEnum.ParseMetadata, null);
273 if (eitherComponent.isRight()) {
274 log.error("can't validate conformance level, component not found, uuid {}", componentUuid);
275 BeEcompErrorManager.getInstance().logBeComponentMissingError("validateConformanceLevel", componentTypeEnum.getValue(), componentUuid);
276 StorageOperationStatus status = eitherComponent.right().value();
277 ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(status, componentTypeEnum);
278 ResponseFormat responseFormat = componentsUtils.getResponseFormat(actionStatus);
279 return Either.right(responseFormat);
281 String componentConformanceLevel = eitherComponent.left().value().getMetadataDataDefinition().getConformanceLevel();
282 if (StringUtils.isBlank(componentConformanceLevel)) {
283 log.error("component conformance level property is null or empty, uuid {}", componentUuid);
284 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
285 return Either.right(errorResponse);
287 String configConformanceLevel = ConfigurationManager.getConfigurationManager().getConfiguration().getMinToscaConformanceLevel();
288 Boolean result = true;
289 if (CommonBeUtils.conformanceLevelCompare(componentConformanceLevel, configConformanceLevel) < 0) {
290 log.error("invalid asset conformance level, uuid {}, asset conformanceLevel {}, config conformanceLevel {}", componentUuid,
291 componentConformanceLevel, configConformanceLevel);
294 log.trace("conformance level validation finished");
295 return Either.left(result);
298 protected void validateIcon(User user, Component component, AuditingActionEnum actionEnum) {
299 log.debug("validate Icon");
300 ComponentTypeEnum type = component.getComponentType();
301 String icon = component.getIcon();
302 if (!ValidationUtils.validateStringNotEmpty(icon)) {
303 log.info("icon is missing.");
304 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_MISSING_ICON, type.getValue());
305 componentsUtils.auditComponentAdmin(errorResponse, user, component, actionEnum, type);
306 throw new ComponentException(ActionStatus.COMPONENT_MISSING_ICON, type.getValue());
309 validateIcon(icon, type);
310 } catch (ComponentException e) {
311 ResponseFormat responseFormat =
312 e.getResponseFormat() != null ? e.getResponseFormat() : componentsUtils.getResponseFormat(e.getActionStatus(), e.getParams());
313 componentsUtils.auditComponentAdmin(responseFormat, user, component, actionEnum, type);
318 private void validateIcon(String icon, ComponentTypeEnum type) {
320 if (!ValidationUtils.validateIconLength(icon)) {
321 log.debug("icon exceeds max length");
322 throw new ComponentException(ActionStatus.COMPONENT_ICON_EXCEEDS_LIMIT, type.getValue(), "" + ValidationUtils.ICON_MAX_LENGTH);
324 if (!ValidationUtils.validateIcon(icon)) {
325 log.info("icon is invalid.");
326 throw new ComponentException(ActionStatus.COMPONENT_INVALID_ICON, type.getValue());
331 protected void checkComponentFieldsForOverrideAttempt(Component component) {
332 if (component.getLifecycleState() != null) {
333 log.info("LifecycleState cannot be defined by user. This field will be overridden by the application");
335 if (component.getVersion() != null) {
336 log.info("Version cannot be defined by user. This field will be overridden by the application");
338 if (component.getCreatorUserId() != null || component.getCreatorFullName() != null) {
339 log.info("Creator cannot be defined by user. This field will be overridden by the application");
341 if (component.getLastUpdaterUserId() != null || component.getLastUpdaterFullName() != null) {
342 log.info("Last Updater cannot be defined by user. This field will be overridden by the application");
344 if (component.getCreationDate() != null) {
345 log.info("Creation Date cannot be defined by user. This field will be overridden by the application");
347 if (component.isHighestVersion() != null) {
348 log.info("Is Highest Version cannot be defined by user. This field will be overridden by the application");
350 if (component.getUUID() != null) {
351 log.info("UUID cannot be defined by user. This field will be overridden by the application");
353 if (component.getLastUpdateDate() != null) {
354 log.info("Last Update Date cannot be defined by user. This field will be overridden by the application");
356 if (component.getUniqueId() != null) {
357 log.info("uid cannot be defined by user. This field will be overridden by the application.");
358 component.setUniqueId(null);
360 if (component.getInvariantUUID() != null) {
361 log.info("Invariant UUID cannot be defined by user. This field will be overridden by the application.");
365 protected void validateComponentFieldsBeforeCreate(User user, Component component, AuditingActionEnum actionEnum) {
366 // validate component name uniqueness
367 log.debug("validate component name ");
368 componentNameValidator.validateAndCorrectField(user, component, actionEnum);
369 // validate description
370 log.debug("validate description");
371 componentDescriptionValidator.validateAndCorrectField(user, component, actionEnum);
373 log.debug("validate tags");
374 componentTagsValidator.validateAndCorrectField(user, component, actionEnum);
375 // validate contact info
376 log.debug("validate contact info");
377 componentContactIdValidator.validateAndCorrectField(user, component, actionEnum);
379 log.debug("validate icon");
380 validateIcon(user, component, actionEnum);
383 public CapReqDef getRequirementsAndCapabilities(String componentId, ComponentTypeEnum componentTypeEnum, String userId) {
384 validateUserExists(userId);
385 ComponentParametersView filter = new ComponentParametersView(true);
386 filter.setIgnoreCapabilities(false);
387 filter.setIgnoreRequirements(false);
388 filter.setIgnoreComponentInstances(false);
390 Component component = validateComponentExists(componentId, componentTypeEnum, filter);
391 return new CapReqDef(component.getRequirements(), component.getCapabilities());
392 } catch (ComponentException e) {
393 BeEcompErrorManager.getInstance().logBeComponentMissingError("getRequirementsAndCapabilities", componentTypeEnum.getValue(), componentId);
394 throwComponentException(e.getResponseFormat());
399 public Either<List<Component>, ResponseFormat> getLatestVersionNotAbstractComponents(boolean isAbstractAbstract,
400 ComponentTypeEnum componentTypeEnum,
401 String internalComponentType, List<String> componentUids,
404 validateUserExists(userId);
405 List<Component> result = new ArrayList<>();
406 List<String> componentsUidToFetch = new ArrayList<>();
407 componentsUidToFetch.addAll(componentUids);
408 if (!componentsUidToFetch.isEmpty()) {
409 log.debug("Number of Components to fetch from graph is {}", componentsUidToFetch.size());
410 Either<List<Component>, StorageOperationStatus> nonCheckoutCompResponse = toscaOperationFacade
411 .getLatestVersionNotAbstractComponents(isAbstractAbstract, componentTypeEnum, internalComponentType, componentsUidToFetch);
412 if (nonCheckoutCompResponse.isLeft()) {
413 log.debug("Retrived Resource successfully.");
414 result.addAll(nonCheckoutCompResponse.left().value());
417 componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(nonCheckoutCompResponse.right().value())));
420 return Either.left(result);
422 janusGraphDao.commit();
426 public Either<List<Component>, ResponseFormat> getLatestVersionNotAbstractComponentsMetadata(boolean isAbstractAbstract,
427 HighestFilterEnum highestFilter,
428 ComponentTypeEnum componentTypeEnum,
429 String internalComponentType, String userId,
431 Either<List<Component>, StorageOperationStatus> nonCheckoutCompResponse = null;
433 validateUserExists(userId);
434 nonCheckoutCompResponse = toscaOperationFacade
435 .getLatestVersionNotAbstractMetadataOnly(isAbstractAbstract, componentTypeEnum, internalComponentType, modelName);
436 if (nonCheckoutCompResponse.isLeft()) {
437 log.debug("Retrieved Resource successfully.");
438 return Either.left(nonCheckoutCompResponse.left().value());
441 .right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(nonCheckoutCompResponse.right().value())));
443 if(nonCheckoutCompResponse != null && nonCheckoutCompResponse.isLeft() ) {
444 janusGraphDao.commit();
449 public void setDeploymentArtifactsPlaceHolder(Component component, User user) {
452 @SuppressWarnings("unchecked")
453 public void setToscaArtifactsPlaceHolders(Component component, User user) {
454 Map<String, ArtifactDefinition> artifactMap = component.getToscaArtifacts();
455 if (artifactMap == null) {
456 artifactMap = new HashMap<>();
458 String componentUniqueId = component.getUniqueId();
459 String componentSystemName = component.getSystemName();
460 String componentType = component.getComponentType().getValue().toLowerCase();
461 Map<String, Object> toscaArtifacts = ConfigurationManager.getConfigurationManager().getConfiguration().getToscaArtifacts();
462 if (toscaArtifacts != null) {
463 for (Entry<String, Object> artifactInfoMap : toscaArtifacts.entrySet()) {
464 Map<String, Object> artifactInfo = (Map<String, Object>) artifactInfoMap.getValue();
465 ArtifactDefinition artifactDefinition = artifactsBusinessLogic
466 .createArtifactPlaceHolderInfo(componentUniqueId, artifactInfoMap.getKey(), artifactInfo, user, ArtifactGroupTypeEnum.TOSCA);
468 .setArtifactName(ValidationUtils.normalizeFileName(componentType + "-" + componentSystemName + artifactInfo.get("artifactName")));
469 artifactMap.put(artifactDefinition.getArtifactLabel(), artifactDefinition);
472 component.setToscaArtifacts(artifactMap);
475 public Either<ArtifactDefinition, Operation> populateToscaArtifacts(Component component, User user, boolean isInCertificationRequest,
476 boolean inTransaction, boolean shouldLock) {
477 return populateToscaArtifacts(component, user, isInCertificationRequest, inTransaction, shouldLock, true, true);
480 public Either<ArtifactDefinition, Operation> populateToscaArtifacts(Component component, User user, boolean isInCertificationRequest,
481 boolean inTransaction, boolean shouldLock, boolean retrieveResource) {
482 return populateToscaArtifacts(component, user, isInCertificationRequest, inTransaction, shouldLock, true, retrieveResource);
485 private Either<ArtifactDefinition, Operation> populateToscaArtifacts(Component component, User user, boolean isInCertificationRequest,
486 boolean inTransaction, boolean shouldLock, boolean fetchTemplatesFromDB,
487 boolean retrieveResource) {
488 if (retrieveResource) {
489 Either<Component, StorageOperationStatus> toscaElement = toscaOperationFacade.getToscaFullElement(component.getUniqueId());
490 if (toscaElement.isRight()) {
491 throw new ByActionStatusComponentException(
492 componentsUtils.convertFromStorageResponse(toscaElement.right().value(), component.getComponentType()));
494 component = toscaElement.left().value();
496 Either<ArtifactDefinition, Operation> generateToscaRes = saveToscaArtifactAndPopulateToscaArtifactsWithResult(component, componentsUtils,
497 ArtifactTypeEnum.TOSCA_TEMPLATE,
498 (comp, toscaArtifact) -> saveToscaArtifactPayload(toscaArtifact, comp, user, isInCertificationRequest, shouldLock, inTransaction,
499 fetchTemplatesFromDB));
500 if (!isAbstractResource(component)) {
501 generateToscaRes = saveToscaArtifactAndPopulateToscaArtifactsWithResult(component, componentsUtils, ArtifactTypeEnum.TOSCA_CSAR,
502 (comp, toscaArtifactArg) -> saveToscaArtifactPayload(toscaArtifactArg, comp, user, isInCertificationRequest, shouldLock,
503 inTransaction, true));
505 return generateToscaRes;
508 private boolean isAbstractResource(Component component) {
509 return component.getComponentType() == ComponentTypeEnum.RESOURCE && ((Resource) component).isAbstract();
512 private Either<ArtifactDefinition, Operation> saveToscaArtifactPayload(ArtifactDefinition artifactDefinition,
513 org.openecomp.sdc.be.model.Component component, User user,
514 boolean isInCertificationRequest, boolean shouldLock,
515 boolean inTransaction, boolean fetchTemplatesFromDB) {
516 return artifactsBusinessLogic
517 .generateAndSaveToscaArtifact(artifactDefinition, component, user, isInCertificationRequest, shouldLock, inTransaction,
518 fetchTemplatesFromDB);
521 public ImmutablePair<String, byte[]> getToscaModelByComponentUuid(ComponentTypeEnum componentType, String uuid,
522 ResourceCommonInfo resourceCommonInfo) {
523 Either<List<Component>, StorageOperationStatus> latestVersionEither = toscaOperationFacade.getComponentListByUuid(uuid, null);
524 if (latestVersionEither.isRight()) {
525 throw new ByActionStatusComponentException(
526 componentsUtils.convertFromStorageResponse(latestVersionEither.right().value(), componentType));
528 List<Component> components = latestVersionEither.left().value();
529 Component component = components.stream().filter(Component::isHighestVersion).findFirst().orElse(null);
530 if (component == null) {
531 component = components.stream().filter(c -> c.getLifecycleState() == LifecycleStateEnum.CERTIFIED).findFirst().orElse(null);
533 if (component == null) {
534 throw new ByResponseFormatComponentException(
535 componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(StorageOperationStatus.NOT_FOUND, componentType)));
537 resourceCommonInfo.setResourceName(component.getName());
538 // TODO remove after migration - handle artifact not found(no
541 if (null == component.getToscaArtifacts() || component.getToscaArtifacts().isEmpty()) {
542 throw new ByResponseFormatComponentException(
543 componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND, ArtifactTypeEnum.TOSCA_CSAR.name()));
545 ArtifactDefinition csarArtifact = component.getToscaArtifacts().values().stream()
546 .filter(p -> p.getArtifactType().equals(ArtifactTypeEnum.TOSCA_CSAR.getType())).findAny().get();
547 return artifactsBusinessLogic.handleDownloadToscaModelRequest(component, csarArtifact);
550 protected StorageOperationStatus markComponentToDelete(Component component) {
551 ComponentTypeEnum componentType = component.getComponentType();
552 String uniqueId = component.getUniqueId();
553 if (Boolean.TRUE.equals(component.getIsDeleted())) {
554 log.info("component {} already marked as deleted. id= {}, type={}", component.getName(), uniqueId, componentType);
555 return StorageOperationStatus.NOT_FOUND;
557 StorageOperationStatus markResourceToDelete = toscaOperationFacade.markComponentToDelete(component);
558 if (StorageOperationStatus.OK != markResourceToDelete) {
559 log.debug("failed to mark component {} of type {} for delete. error = {}", uniqueId, componentType, markResourceToDelete);
560 return markResourceToDelete;
562 log.debug("Component {} of type {} was marked as deleted", uniqueId, componentType);
563 updateCatalog(component, ChangeTypeEnum.DELETE);
564 return StorageOperationStatus.OK;
568 public Either<Boolean, ResponseFormat> validateAndUpdateDescription(User user, Component currentComponent, Component updatedComponent,
569 AuditingActionEnum auditingAction) {
570 String descriptionUpdated = updatedComponent.getDescription();
571 String descriptionCurrent = currentComponent.getDescription();
572 if (descriptionUpdated != null && !descriptionCurrent.equals(descriptionUpdated)) {
573 componentDescriptionValidator.validateAndCorrectField(user, updatedComponent, auditingAction);
574 currentComponent.setDescription(updatedComponent.getDescription());
576 return Either.left(true);
579 public Either<Boolean, ResponseFormat> validateAndUpdateProjectCode(User user, Component currentComponent, Component updatedComponent) {
580 String projectCodeUpdated = updatedComponent.getProjectCode();
581 String projectCodeCurrent = currentComponent.getProjectCode();
582 if (projectCodeUpdated != null && !projectCodeCurrent.equals(projectCodeUpdated)) {
584 componentProjectCodeValidator.validateAndCorrectField(user, updatedComponent, null);
585 } catch (ComponentException exp) {
586 ResponseFormat errorRespons = exp.getResponseFormat();
587 return Either.right(errorRespons);
589 currentComponent.setProjectCode(updatedComponent.getProjectCode());
591 return Either.left(true);
594 public Either<Boolean, ResponseFormat> validateAndUpdateIcon(User user, Component currentComponent, Component updatedComponent,
595 boolean hasBeenCertified) {
596 String iconUpdated = updatedComponent.getIcon();
597 String iconCurrent = currentComponent.getIcon();
598 if (iconUpdated != null && !iconCurrent.equals(iconUpdated)) {
599 if (!hasBeenCertified) {
600 componentIconValidator.validateAndCorrectField(user, updatedComponent, null);
601 currentComponent.setIcon(updatedComponent.getIcon());
603 log.info("icon {} cannot be updated once the component has been certified once.", iconUpdated);
604 ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_PARAMETER_CANNOT_BE_CHANGED, "Icon",
605 currentComponent.getComponentType().name().toLowerCase());
606 return Either.right(errorResponse);
609 return Either.left(true);
612 protected Either<List<String>, ResponseFormat> deleteMarkedComponents(ComponentTypeEnum componentType) {
613 log.trace("start deleteMarkedComponents");
614 Either<List<String>, StorageOperationStatus> deleteMarkedElements = toscaOperationFacade.deleteMarkedElements(componentType);
615 if (deleteMarkedElements.isRight()) {
616 janusGraphDao.rollback();
617 ResponseFormat responseFormat = componentsUtils
618 .getResponseFormat(componentsUtils.convertFromStorageResponse(deleteMarkedElements.right().value(), componentType));
619 return Either.right(responseFormat);
621 log.trace("end deleteMarkedComponents");
622 janusGraphDao.commit();
623 return Either.left(deleteMarkedElements.left().value());
626 public Either<List<ArtifactDefinition>, StorageOperationStatus> getComponentArtifactsForDelete(String parentId, NodeTypeEnum parentType) {
627 List<ArtifactDefinition> artifacts = new ArrayList<>();
628 Either<Map<String, ArtifactDefinition>, StorageOperationStatus> artifactsResponse = artifactToscaOperation.getArtifacts(parentId);
629 if (artifactsResponse.isRight()) {
630 if (artifactsResponse.right().value() != StorageOperationStatus.NOT_FOUND) {
631 log.debug("failed to retrieve artifacts for {} {}", parentType, parentId);
632 return Either.right(artifactsResponse.right().value());
635 artifacts.addAll(artifactsResponse.left().value().values());
637 return Either.left(artifacts);
643 * @param dataParamsToReturn - ui list of params to return
646 public Either<UiComponentDataTransfer, ResponseFormat> getComponentDataFilteredByParams(String componentId, User user,
647 List<String> dataParamsToReturn) {
649 validateUserExists(user);
651 UiComponentDataTransfer result = new UiComponentDataTransfer();
652 if (dataParamsToReturn == null || dataParamsToReturn.isEmpty()) {
655 Either<UiComponentDataTransfer, ResponseFormat> uiDataTransferEither = getUiComponentDataTransferByComponentId(componentId,
657 if (uiDataTransferEither.isRight()) {
658 return Either.right(uiDataTransferEither.right().value());
660 result = uiDataTransferEither.left().value();
662 return Either.left(result);
665 protected <T extends Component> void generateAndAddInputsFromGenericTypeProperties(T component, Resource genericType) {
666 List<InputDefinition> genericAndComponentInputs = new ArrayList<>();
667 List<InputDefinition> genericInputs = genericTypeBusinessLogic.generateInputsFromGenericTypeProperties(genericType);
668 genericAndComponentInputs.addAll(genericInputs);
669 if (null != component.getInputs()) {
670 List<InputDefinition> nonGenericInputsFromComponent = getAllNonGenericInputsFromComponent(genericInputs, component.getInputs());
671 genericAndComponentInputs.addAll(nonGenericInputsFromComponent);
673 component.setInputs(genericAndComponentInputs);
676 private List<InputDefinition> getAllNonGenericInputsFromComponent(List<InputDefinition> genericInputs, List<InputDefinition> componentInputs) {
677 if (genericInputs == null) {
678 return componentInputs;
680 Map<String, InputDefinition> inputByNameMap = MapUtil.toMap(genericInputs, InputDefinition::getName);
681 List<InputDefinition> componentNonGenericInputs = new ArrayList<>();
682 componentInputs.stream().forEach(input -> {
683 if (!inputByNameMap.containsKey(input.getName())) {
684 componentNonGenericInputs.add(input);
687 return componentNonGenericInputs;
690 protected <T extends Component> Resource fetchAndSetDerivedFromGenericType(T component) {
691 Either<Resource, ResponseFormat> genericTypeEither = this.genericTypeBusinessLogic.fetchDerivedFromGenericType(component);
692 if (genericTypeEither.isRight()) {
693 log.debug("Failed to fetch latest generic type for component {} of type", component.getName(), component.assetType());
694 throw new ByActionStatusComponentException(ActionStatus.GENERIC_TYPE_NOT_FOUND, component.assetType());
696 Resource genericTypeResource = genericTypeEither.left().value();
697 component.setDerivedFromGenericInfo(genericTypeResource);
698 return genericTypeResource;
701 public Either<Map<String, List<IComponentInstanceConnectedElement>>, ResponseFormat> getFilteredComponentInstanceProperties(String componentId,
702 Map<FilterKeyEnum, List<String>> filters,
704 Either<Map<String, List<IComponentInstanceConnectedElement>>, ResponseFormat> response = null;
705 Either<Component, StorageOperationStatus> getResourceRes = null;
707 if (!filters.containsKey(FilterKeyEnum.NAME_FRAGMENT) && StringUtils.isEmpty(filters.get(FilterKeyEnum.NAME_FRAGMENT).get(0))) {
708 response = Either.right(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT));
710 if (userId != null && response == null) {
711 validateUserExists(userId);
713 if (response == null) {
714 getResourceRes = toscaOperationFacade.getToscaElement(componentId);
715 if (getResourceRes.isRight()) {
717 .right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(getResourceRes.right().value())));
720 if (response == null) {
721 response = getFilteredComponentInstancesProperties(getResourceRes.left().value(), filters);
723 } catch (Exception e) {
724 log.debug("The exception {} occured during filtered instance properties fetching. the containing component is {}. ", e, componentId);
725 response = Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
727 if (response != null && response.isLeft()) {
728 toscaOperationFacade.commit();
730 toscaOperationFacade.rollback();
736 private Either<Map<String, List<IComponentInstanceConnectedElement>>, ResponseFormat> getFilteredComponentInstancesProperties(Component component,
737 Map<FilterKeyEnum, List<String>> filters) {
738 Map<String, List<IComponentInstanceConnectedElement>> filteredProperties = new HashMap<>();
739 Either<Map<String, List<IComponentInstanceConnectedElement>>, ResponseFormat> result = Either.left(filteredProperties);
740 List<ComponentInstance> filteredInstances = getFilteredInstances(component, filters.get(FilterKeyEnum.RESOURCE_TYPE));
741 String propertyNameFragment = filters.get(FilterKeyEnum.NAME_FRAGMENT).get(0);
742 boolean searchByFragment = propertyNameFragment.length() > 3;
743 if (CollectionUtils.isNotEmpty(filteredInstances)) {
744 for (ComponentInstance instance : filteredInstances) {
745 if (component.getComponentInstancesProperties() != null && component.getComponentInstancesProperties()
746 .containsKey(instance.getUniqueId())) {
747 List<IComponentInstanceConnectedElement> currProperties = getFilteredComponentInstanceProperties(
748 component.getComponentInstancesProperties().get(instance.getUniqueId()), propertyNameFragment, searchByFragment);
749 setFilteredProperties(filteredProperties, instance, currProperties);
751 if (component.getComponentInstancesInputs() != null && component.getComponentInstancesInputs().containsKey(instance.getUniqueId())) {
752 List<IComponentInstanceConnectedElement> currInputs = getFilteredComponentInstanceInputs(
753 component.getComponentInstancesInputs().get(instance.getUniqueId()), propertyNameFragment, searchByFragment);
754 if (CollectionUtils.isNotEmpty(currInputs)) {
755 checkFilteredProperties(filteredProperties, instance, currInputs);
763 private void setFilteredProperties(Map<String, List<IComponentInstanceConnectedElement>> filteredProperties, ComponentInstance instance,
764 List<IComponentInstanceConnectedElement> currProperties) {
765 if (CollectionUtils.isNotEmpty(currProperties)) {
766 filteredProperties.put(instance.getUniqueId(), currProperties);
770 private void checkFilteredProperties(Map<String, List<IComponentInstanceConnectedElement>> filteredProperties, ComponentInstance instance,
771 List<IComponentInstanceConnectedElement> currInputs) {
772 if (filteredProperties.get(instance.getUniqueId()) != null) {
773 filteredProperties.get(instance.getUniqueId()).addAll(currInputs);
775 filteredProperties.put(instance.getUniqueId(), currInputs);
779 private List<IComponentInstanceConnectedElement> getFilteredComponentInstanceInputs(List<ComponentInstanceInput> inputs,
780 String propertyNameFragment, boolean searchByFragment) {
781 return inputs.stream().filter(i -> isMatchingInput(i, propertyNameFragment, searchByFragment)).collect(Collectors.toList());
784 private List<IComponentInstanceConnectedElement> getFilteredComponentInstanceProperties(List<ComponentInstanceProperty> instanceProperties,
785 String propertyNameFragment, boolean searchByFragment) {
786 return instanceProperties.stream().filter(p -> isMatchingProperty(p, propertyNameFragment, searchByFragment)).collect(Collectors.toList());
789 private boolean isMatchingInput(ComponentInstanceInput input, String propertyNameFragment, boolean searchByFragment) {
790 boolean isMatching = false;
791 if (searchByFragment && input.getName().toLowerCase().contains(propertyNameFragment)) {
794 if (!searchByFragment && input.getName().equalsIgnoreCase(propertyNameFragment)) {
800 private boolean isMatchingProperty(ComponentInstanceProperty property, String propertyNameFragment, boolean searchByFragment) {
801 boolean isMatching = false;
802 if (searchByFragment && property.getName().toLowerCase().contains(propertyNameFragment)) {
805 if (!searchByFragment && property.getName().equalsIgnoreCase(propertyNameFragment)) {
808 if (!isMatching && !ToscaPropertyType.isPrimitiveType(property.getType())) {
809 isMatching = isMatchingComplexPropertyByRecursively(property, propertyNameFragment, searchByFragment);
814 private boolean isMatchingComplexPropertyByRecursively(PropertyDataDefinition property, String propertyNameFragment, boolean searchByFragment) {
816 List<PropertyDefinition> dataTypeProperties;
817 DataTypeDefinition currentProperty;
818 if (searchByFragment && property.getName().toLowerCase().contains(propertyNameFragment.toLowerCase())) {
821 if (!searchByFragment && property.getName().equalsIgnoreCase(propertyNameFragment)) {
824 propertyType = isEmptyInnerType(property) ? property.getType() : property.getSchema().getProperty().getType();
825 if (ToscaPropertyType.isScalarType(propertyType)) {
828 Either<DataTypeDefinition, StorageOperationStatus> getDataTypeByNameRes = propertyOperation.getDataTypeByName(propertyType, null);
829 if (getDataTypeByNameRes.isRight()) {
832 currentProperty = getDataTypeByNameRes.left().value();
833 dataTypeProperties = currentProperty.getProperties();
834 boolean dataPropertiesNotNull = CollectionUtils.isNotEmpty(dataTypeProperties);
835 BooleanSupplier dataMatchesComplexProperty = () -> isMatchingComplexProperty(propertyNameFragment, searchByFragment, dataTypeProperties);
836 BooleanSupplier parentPropertiesNotNull = () -> CollectionUtils.isNotEmpty(currentProperty.getDerivedFrom().getProperties());
837 BooleanSupplier parentDataMatchesComplexProperty = () -> isMatchingComplexProperty(propertyNameFragment, searchByFragment,
838 currentProperty.getDerivedFrom().getProperties());
839 return ((dataPropertiesNotNull && dataMatchesComplexProperty.getAsBoolean()) || (parentPropertiesNotNull.getAsBoolean()
840 && parentDataMatchesComplexProperty.getAsBoolean()));
843 private boolean isMatchingComplexProperty(String propertyNameFragment, boolean searchByFragment, List<PropertyDefinition> dataTypeProperties) {
844 for (PropertyDefinition prop : dataTypeProperties) {
845 if (isMatchingComplexPropertyByRecursively(prop, propertyNameFragment, searchByFragment)) {
852 private boolean isEmptyInnerType(PropertyDataDefinition property) {
853 return property == null || property.getSchema() == null || property.getSchema().getProperty() == null
854 || property.getSchema().getProperty().getType() == null;
857 public Either<Boolean, ResponseFormat> shouldUpgradeToLatestGeneric(Component clonedComponent) {
858 if (!clonedComponent.deriveFromGeneric()) {
859 return Either.left(false);
861 Boolean shouldUpgrade = false;
862 String currentGenericType = clonedComponent.getDerivedFromGenericType();
863 String currentGenericVersion = clonedComponent.getDerivedFromGenericVersion();
864 Resource genericTypeResource = fetchAndSetDerivedFromGenericType(clonedComponent);
865 if (null == currentGenericType || !currentGenericType.equals(genericTypeResource.getToscaResourceName()) || !currentGenericVersion
866 .equals(genericTypeResource.getVersion())) {
867 shouldUpgrade = upgradeToLatestGeneric(clonedComponent, genericTypeResource);
868 if (!shouldUpgrade) {
869 reverntUpdateOfGenericVersion(clonedComponent, currentGenericType, currentGenericVersion);
872 return Either.left(shouldUpgrade);
875 private void reverntUpdateOfGenericVersion(Component clonedComponent, String currentGenericType, String currentGenericVersion) {
876 clonedComponent.setDerivedFromGenericType(currentGenericType);
877 clonedComponent.setDerivedFromGenericVersion(currentGenericVersion);
880 private <T extends ToscaDataDefinition> Either<Map<String, T>, String> validateNoConflictingProperties(List<T> currentList,
881 List<T> upgradedList) {
882 Map<String, T> currentMap = ToscaDataDefinition.listToMapByName(currentList);
883 Map<String, T> upgradedMap = ToscaDataDefinition.listToMapByName(upgradedList);
884 return ToscaDataDefinition.mergeDataMaps(upgradedMap, currentMap, true);
887 private boolean shouldUpgradeNodeType(Component componentToCheckOut, Resource latestGeneric) {
888 List<PropertyDefinition> genericTypeProps = latestGeneric.getProperties();
889 Either<Map<String, PropertyDefinition>, String> validPropertiesMerge = validateNoConflictingProperties(genericTypeProps,
890 ((Resource) componentToCheckOut).getProperties());
891 if (validPropertiesMerge.isRight()) {
892 if (log.isDebugEnabled()) {
893 log.debug("property {} cannot be overriden, check out performed without upgrading to latest generic",
894 validPropertiesMerge.right().value());
898 List<AttributeDefinition> genericTypeAttributes = latestGeneric.getAttributes();
899 final Either<Map<String, AttributeDefinition>, String> validAttributesMerge = validateNoConflictingProperties(genericTypeAttributes,
900 ((Resource) componentToCheckOut).getAttributes());
901 if (validAttributesMerge.isRight()) {
902 if (log.isDebugEnabled()) {
903 log.debug("attribute {} cannot be overriden, check out performed without upgrading to latest generic",
904 validAttributesMerge.right().value());
911 private boolean upgradeToLatestGeneric(Component componentToCheckOut, Resource latestGeneric) {
912 if (!componentToCheckOut.shouldGenerateInputs()) {
913 //node type - validate properties and attributes
914 return shouldUpgradeNodeType(componentToCheckOut, latestGeneric);
916 List<PropertyDefinition> genericTypeProps = latestGeneric.getProperties();
917 List<InputDefinition> genericTypeInputs = null == genericTypeProps ? null
918 : genericTypeBusinessLogic.convertGenericTypePropertiesToInputsDefintion(genericTypeProps, latestGeneric.getUniqueId());
919 List<InputDefinition> currentList = new ArrayList<>();
920 // nullify existing ownerId from existing list and merge into updated list
921 if (null != componentToCheckOut.getInputs()) {
922 for (InputDefinition input : componentToCheckOut.getInputs()) {
923 InputDefinition copy = new InputDefinition(input);
924 copy.setOwnerId(null);
925 currentList.add(copy);
928 if (null == genericTypeInputs) {
929 componentToCheckOut.setInputs(currentList);
932 Either<Map<String, InputDefinition>, String> eitherMerged = validateNoConflictingProperties(genericTypeInputs, currentList);
933 if (eitherMerged.isRight()) {
934 if (log.isDebugEnabled()) {
935 log.debug("input {} cannot be overriden, check out performed without upgrading to latest generic", eitherMerged.right().value());
939 componentToCheckOut.setInputs(new ArrayList<>(eitherMerged.left().value().values()));
943 private List<ComponentInstance> getFilteredInstances(Component component, List<String> resourceTypes) {
944 List<ComponentInstance> filteredInstances = null;
945 if (CollectionUtils.isEmpty(resourceTypes)) {
946 filteredInstances = component.getComponentInstances();
947 } else if (CollectionUtils.isNotEmpty(component.getComponentInstances())) {
948 filteredInstances = component.getComponentInstances().stream().filter(i -> isMatchingType(i.getOriginType(), resourceTypes))
949 .collect(Collectors.toList());
951 if (filteredInstances == null) {
952 filteredInstances = new ArrayList<>();
954 return filteredInstances;
957 private boolean isMatchingType(OriginTypeEnum originType, List<String> resourceTypes) {
958 boolean isMatchingType = false;
959 for (String resourceType : resourceTypes) {
960 if (originType == OriginTypeEnum.findByValue(resourceType.toUpperCase())) {
961 isMatchingType = true;
965 return isMatchingType;
968 public Either<Component, ActionStatus> shouldUpgradeToLatestDerived(Component clonedComponent) {
969 //general implementation. Must be error for service, VF . In ResourceBuisnessLogic exist override
970 return Either.right(ActionStatus.GENERAL_ERROR);
973 protected Either<Component, ResponseFormat> updateCatalog(Component component, ChangeTypeEnum changeStatus) {
974 if (log.isDebugEnabled()) {
975 log.debug("update Catalog start with Component Type {} And Componet Name {} with change status {}",
976 component.getComponentType().name(),component.getName(), changeStatus.name());
978 ActionStatus status = catalogOperations.updateCatalog(changeStatus, component);
979 if (status != ActionStatus.OK) {
980 return Either.right(componentsUtils.getResponseFormat(status));
982 return Either.left(component);
985 public CatalogOperation getCatalogOperations() {
986 return catalogOperations;
990 public void setCatalogOperations(CatalogOperation catalogOperations) {
991 this.catalogOperations = catalogOperations;
994 public List<GroupDefinition> throwComponentException(ResponseFormat responseFormat) {
995 throw new ByResponseFormatComponentException(responseFormat);