re base code
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / lifecycle / LifecycleBusinessLogic.java
index 703e0f9..b0247a2 100644 (file)
 
 package org.openecomp.sdc.be.components.lifecycle;
 
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.annotation.PostConstruct;
-
+import fj.data.Either;
+import org.apache.commons.lang3.StringUtils;
 import org.openecomp.sdc.be.components.distribution.engine.ServiceDistributionArtifactsBuilder;
-import org.openecomp.sdc.be.components.impl.ArtifactsBusinessLogic;
-import org.openecomp.sdc.be.components.impl.ComponentBusinessLogic;
-import org.openecomp.sdc.be.components.impl.ProductBusinessLogic;
-import org.openecomp.sdc.be.components.impl.ResourceBusinessLogic;
-import org.openecomp.sdc.be.components.impl.ServiceBusinessLogic;
+import org.openecomp.sdc.be.components.impl.*;
+import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
 import org.openecomp.sdc.be.components.lifecycle.LifecycleChangeInfoWithAction.LifecycleChanceActionEnum;
 import org.openecomp.sdc.be.dao.api.ActionStatus;
 import org.openecomp.sdc.be.dao.jsongraph.TitanDao;
@@ -39,13 +33,9 @@ import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
 import org.openecomp.sdc.be.impl.ComponentsUtils;
-import org.openecomp.sdc.be.model.Component;
-import org.openecomp.sdc.be.model.LifeCycleTransitionEnum;
-import org.openecomp.sdc.be.model.LifecycleStateEnum;
-import org.openecomp.sdc.be.model.Resource;
-import org.openecomp.sdc.be.model.Service;
-import org.openecomp.sdc.be.model.User;
+import org.openecomp.sdc.be.model.*;
 import org.openecomp.sdc.be.model.jsontitan.datamodel.ToscaElement;
+import org.openecomp.sdc.be.model.jsontitan.operations.NodeTemplateOperation;
 import org.openecomp.sdc.be.model.jsontitan.operations.ToscaElementLifecycleOperation;
 import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
 import org.openecomp.sdc.be.model.jsontitan.utils.ModelConverter;
@@ -54,16 +44,18 @@ import org.openecomp.sdc.be.model.operations.api.IGraphLockOperation;
 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
 import org.openecomp.sdc.be.model.operations.impl.CapabilityOperation;
 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
-import org.openecomp.sdc.be.resources.data.auditing.model.ResourceAuditData;
+import org.openecomp.sdc.be.resources.data.auditing.model.ResourceCommonInfo;
+import org.openecomp.sdc.be.resources.data.auditing.model.ResourceVersionInfo;
 import org.openecomp.sdc.be.tosca.ToscaExportHandler;
 import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.common.log.wrappers.Logger;
 import org.openecomp.sdc.common.util.ValidationUtils;
 import org.openecomp.sdc.exception.ResponseFormat;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 
-import fj.data.Either;
+import javax.annotation.PostConstruct;
+import java.util.HashMap;
+import java.util.Map;
 
 @org.springframework.stereotype.Component("lifecycleBusinessLogic")
 public class LifecycleBusinessLogic {
@@ -82,7 +74,7 @@ public class LifecycleBusinessLogic {
     @Autowired
     private CapabilityOperation capabilityOperation;
 
-    private static final Logger log = LoggerFactory.getLogger(LifecycleBusinessLogic.class);
+    private static final Logger log = Logger.getLogger(LifecycleBusinessLogic.class);
 
     @javax.annotation.Resource
     private ComponentsUtils componentUtils;
@@ -112,6 +104,9 @@ public class LifecycleBusinessLogic {
 
     @Autowired
     ToscaOperationFacade toscaOperationFacade;
+    
+    @Autowired
+    NodeTemplateOperation nodeTemplateOperation;
 
     private Map<String, LifeCycleTransition> stateTransitions;
     private static volatile boolean isInitialized = false;
@@ -130,7 +125,7 @@ public class LifecycleBusinessLogic {
     }
 
     private void initStateOperations() {
-        stateTransitions = new HashMap<String, LifeCycleTransition>();
+        stateTransitions = new HashMap<>();
 
         LifeCycleTransition checkoutOp = new CheckoutTransition(componentUtils, lifecycleOperation, toscaOperationFacade, titanDao);
         stateTransitions.put(checkoutOp.getName().name(), checkoutOp);
@@ -142,7 +137,8 @@ public class LifecycleBusinessLogic {
         LifeCycleTransition checkinOp = new CheckinTransition(componentUtils, lifecycleOperation, toscaOperationFacade, titanDao);
         stateTransitions.put(checkinOp.getName().name(), checkinOp);
 
-        LifeCycleTransition certificationRequest = new CertificationRequestTransition(componentUtils, lifecycleOperation, serviceDistributionArtifactsBuilder, serviceBusinessLogic, capabilityOperation, toscaExportUtils, toscaOperationFacade, titanDao);
+        LifeCycleTransition certificationRequest = new CertificationRequestTransition(componentUtils, lifecycleOperation, serviceBusinessLogic, toscaOperationFacade,
+                titanDao);
         stateTransitions.put(certificationRequest.getName().name(), certificationRequest);
 
         LifeCycleTransition startCertification = new StartCertificationTransition(componentUtils, lifecycleOperation, toscaOperationFacade, titanDao);
@@ -156,6 +152,7 @@ public class LifecycleBusinessLogic {
 
         CertificationChangeTransition successCertification = new CertificationChangeTransition(LifeCycleTransitionEnum.CERTIFY, componentUtils, lifecycleOperation, toscaOperationFacade, titanDao);
         successCertification.setArtifactsManager(artifactsBusinessLogic);
+        successCertification.setNodeTemplateOperation(nodeTemplateOperation);
         stateTransitions.put(successCertification.getName().name(), successCertification);
     }
 
@@ -172,10 +169,10 @@ public class LifecycleBusinessLogic {
         return (Either<Resource, ResponseFormat>) changeComponentState(ComponentTypeEnum.RESOURCE, resourceId, modifier, transitionEnum, changeInfo, inTransaction, needLock);
     }
 
-    private boolean isComponentVFCMT(Component component, ComponentTypeEnum componentType){
-        if (componentType.equals(ComponentTypeEnum.RESOURCE)){
-            ResourceTypeEnum resourceType = ((ResourceMetadataDataDefinition)component.getComponentMetadataDefinition().getMetadataDataDefinition()).getResourceType();
-            if (resourceType.equals(ResourceTypeEnum.VFCMT)){
+    private boolean isComponentVFCMT(Component component, ComponentTypeEnum componentType) {
+        if (componentType.equals(ComponentTypeEnum.RESOURCE)) {
+            ResourceTypeEnum resourceType = ((ResourceMetadataDataDefinition) component.getComponentMetadataDefinition().getMetadataDataDefinition()).getResourceType();
+            if (resourceType.equals(ResourceTypeEnum.VFCMT)) {
                 return true;
             }
         }
@@ -188,11 +185,11 @@ public class LifecycleBusinessLogic {
         LifeCycleTransition lifeCycleTransition = stateTransitions.get(transitionEnum.name());
         if (lifeCycleTransition == null) {
             log.debug("state operation is not valid. operations allowed are: {}", LifeCycleTransitionEnum.valuesAsString());
-            ResponseFormat error = componentUtils.getInvalidContentErrorAndAudit(modifier,componentId, AuditingActionEnum.CHECKOUT_RESOURCE);
+            ResponseFormat error = componentUtils.getInvalidContentErrorAndAudit(modifier, componentId, AuditingActionEnum.CHECKOUT_RESOURCE);
             return Either.right(error);
         }
         Component component = null;
-        log.info("get resource from graph");
+        log.debug("get resource from graph");
         ResponseFormat errorResponse;
 
         Either<? extends Component, ResponseFormat> eitherResourceResponse = getComponentForChange(componentType, componentId, modifier, lifeCycleTransition, changeInfo);
@@ -205,12 +202,17 @@ public class LifecycleBusinessLogic {
 
         // lock resource
         if (!inTransaction && needLock) {
-            log.info("lock component {}", componentId);
+            log.debug("lock component {}", componentId);
             Either<Boolean, ResponseFormat> eitherLockResource = lockComponent(componentType, component);
             if (eitherLockResource.isRight()) {
                 errorResponse = eitherLockResource.right().value();
-                componentUtils.auditComponent(errorResponse, modifier, component, lifeCycleTransition.getAuditingAction(), componentType,
-                        ResourceAuditData.newBuilder().state(resourceCurrState.name()).version(resourceCurrVersion).build());
+                componentUtils.auditComponent(errorResponse, modifier, component, lifeCycleTransition.getAuditingAction(),
+                        new ResourceCommonInfo(componentType.getValue()),
+                        ResourceVersionInfo.newBuilder()
+                                .state(resourceCurrState.name())
+                                .version(resourceCurrVersion)
+                                .build());
+
 
                 log.error("lock component {} failed", componentId);
                 return Either.right(errorResponse);
@@ -221,9 +223,13 @@ public class LifecycleBusinessLogic {
             Either<String, ResponseFormat> commentValidationResult = validateComment(changeInfo, transitionEnum);
             if (commentValidationResult.isRight()) {
                 errorResponse = commentValidationResult.right().value();
-                componentUtils.auditComponent(errorResponse, modifier, component, lifeCycleTransition.getAuditingAction(), componentType,
-                        ResourceAuditData.newBuilder()
-                                .state(resourceCurrState.name()).version(resourceCurrVersion).build(), changeInfo.getUserRemarks());
+                componentUtils.auditComponent(errorResponse, modifier, component, lifeCycleTransition.getAuditingAction(),
+                        new ResourceCommonInfo(componentType.getValue()),
+                        ResourceVersionInfo.newBuilder()
+                                .state(resourceCurrState.name())
+                                .version(resourceCurrVersion)
+                                .build(),
+                        changeInfo.getUserRemarks());
                 return Either.right(errorResponse);
             }
             changeInfo.setUserRemarks(commentValidationResult.left().value());
@@ -233,12 +239,12 @@ public class LifecycleBusinessLogic {
                 return Either.right(validateHighestVersion.right().value());
             }
             log.debug("after validate Highest Version");
-            if (isComponentVFCMT(component,componentType)){
-                Either<? extends Component, ResponseFormat> changeVFCMTStateResponse = changeVFCMTState(componentType, modifier, transitionEnum, changeInfo, true, component);
-                if (changeVFCMTStateResponse.isRight()){
-                    return changeVFCMTStateResponse;
+            if (componentType == ComponentTypeEnum.RESOURCE) {
+                Either<? extends Component, ResponseFormat> changeResourceResponse = changeResourceState(componentType, modifier, transitionEnum, changeInfo, true, component);
+                if (changeResourceResponse.isRight()) {
+                    return changeResourceResponse;
                 }
-                component = changeVFCMTStateResponse.left().value();
+                component = changeResourceResponse.left().value();
             }
             return changeState(component, lifeCycleTransition, componentType, modifier, changeInfo, inTransaction);
         } finally {
@@ -255,49 +261,75 @@ public class LifecycleBusinessLogic {
     }
 
     /*
-     * special case for certification of VFCMT - VFCMT can be certified by Designer or Tester right after checkin
-     * in case the operation "submit for test" / "start testing" is done to "VFCMT" - please return error 400
+     * special case for certification of VFCMT - VFCMT can be certified by Designer or Tester right after checkin in case the operation "submit for test" / "start testing" is done to "VFCMT" - please return error 400
      */
-    private Either<? extends Component, ResponseFormat> changeVFCMTState(ComponentTypeEnum componentType, User modifier,
-            LifeCycleTransitionEnum transitionEnum, LifecycleChangeInfoWithAction changeInfo, boolean inTransaction,
+    private Either<? extends Component, ResponseFormat> changeResourceState(ComponentTypeEnum componentType, User modifier, LifeCycleTransitionEnum transitionEnum, LifecycleChangeInfoWithAction changeInfo, boolean inTransaction,
             Component component) {
         LifecycleStateEnum oldState = component.getLifecycleState();
         Component updatedComponent = component;
-        if (transitionEnum.equals(LifeCycleTransitionEnum.START_CERTIFICATION) ||
-                transitionEnum.equals(LifeCycleTransitionEnum.CERTIFICATION_REQUEST)){
-            return Either.right(componentUtils.getResponseFormat(
-                    ActionStatus.RESOURCE_VFCMT_LIFECYCLE_STATE_NOT_VALID, transitionEnum.getDisplayName()));
-        }    //certify is done directly from checkin
-        else if (transitionEnum.equals(LifeCycleTransitionEnum.CERTIFY) && oldState.equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKIN)){
-            //we will call for submit for testing first and then for certify
-            Either<? extends Component, ResponseFormat> actionResponse = changeState(component,
-                    stateTransitions.get(LifeCycleTransitionEnum.CERTIFICATION_REQUEST.name()),
-                    componentType, modifier, changeInfo, inTransaction);
-            if (actionResponse.isRight()) {
-                return actionResponse;
+        if (transitionEnum == LifeCycleTransitionEnum.START_CERTIFICATION || transitionEnum == LifeCycleTransitionEnum.CERTIFICATION_REQUEST) {
+            //for VFCMT use old error for backward comp. 
+            ActionStatus status = isComponentVFCMT(component, componentType) ? ActionStatus.RESOURCE_VFCMT_LIFECYCLE_STATE_NOT_VALID : ActionStatus.RESOURCE_LIFECYCLE_STATE_NOT_VALID;
+            return Either.right(componentUtils.getResponseFormat(status, transitionEnum.getDisplayName()));
+        } // certify is done directly from checkin
+        else if (transitionEnum == LifeCycleTransitionEnum.CERTIFY) {
+            log.debug("Certification request for resource {} ", component.getUniqueId());
+            if (oldState == LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT) {
+                log.debug("Resource {} is in Checkout state perform checkin", component.getUniqueId());
+                Either<? extends Component, ResponseFormat> actionResponse = changeState(component, stateTransitions.get(LifeCycleTransitionEnum.CHECKIN.name()), componentType, modifier, changeInfo, inTransaction);
+                if (actionResponse.isRight()) {
+                    log.debug("Failed to check in Resource {} error {}", component.getUniqueId(), actionResponse.right().value());
+                    return actionResponse;
+                }
+                updatedComponent = actionResponse.left().value();
+                oldState = updatedComponent.getLifecycleState();
             }
-            updatedComponent = actionResponse.left().value();
-            actionResponse = changeState(updatedComponent,
-                    stateTransitions.get(LifeCycleTransitionEnum.START_CERTIFICATION.name()),
-                    componentType, modifier, changeInfo, inTransaction);
-            if (actionResponse.isRight()) {
-                return actionResponse;
+            if (oldState == LifecycleStateEnum.NOT_CERTIFIED_CHECKIN) {
+                // we will call for submit for testing first and then for certify
+                Either<? extends Component, ResponseFormat> actionResponse = changeState(updatedComponent, stateTransitions.get(LifeCycleTransitionEnum.CERTIFICATION_REQUEST.name()), componentType, modifier, changeInfo, inTransaction);
+                if (actionResponse.isRight()) {
+                    return actionResponse;
+                }
+                updatedComponent = actionResponse.left().value();
+                actionResponse = changeState(updatedComponent, stateTransitions.get(LifeCycleTransitionEnum.START_CERTIFICATION.name()), componentType, modifier, changeInfo, inTransaction);
+                if (actionResponse.isRight()) {
+                    return actionResponse;
+                }
+                updatedComponent = actionResponse.left().value();
+            }
+            if(oldState == LifecycleStateEnum.CERTIFIED){
+                failOnAlreadyCertifiedResource(component);
             }
-            updatedComponent = actionResponse.left().value();
-             
         }
         return Either.left(updatedComponent);
     }
 
-    private Either<? extends Component, ResponseFormat> changeState(Component component, LifeCycleTransition lifeCycleTransition,
-            ComponentTypeEnum componentType, User modifier,    LifecycleChangeInfoWithAction changeInfo,boolean inTransaction){
+    private void failOnAlreadyCertifiedResource(Component component) {
+        String firstName = null;
+        String lastName = null;
+        if(StringUtils.isNotEmpty(component.getLastUpdaterFullName())){
+            String[] fullName = component.getLastUpdaterFullName().split(" ");
+            if(fullName.length == 2){
+                firstName = fullName[0];
+                lastName = fullName[1];
+            }
+        }
+        throw new ComponentException(ActionStatus.COMPONENT_ALREADY_CERTIFIED,
+                component.getName(),
+                component.getComponentType().name().toLowerCase(),
+                firstName,
+                lastName,
+                component.getLastUpdaterUserId());
+    }
+
+    private Either<? extends Component, ResponseFormat> changeState(Component component, LifeCycleTransition lifeCycleTransition, ComponentTypeEnum componentType, User modifier, LifecycleChangeInfoWithAction changeInfo, boolean inTransaction) {
         ResponseFormat errorResponse;
 
         LifecycleStateEnum oldState = component.getLifecycleState();
         String resourceCurrVersion = component.getVersion();
         ComponentBusinessLogic bl = getComponentBL(componentType);
 
-        Either<User, ResponseFormat> ownerResult = lifeCycleTransition.getComponentOwner(component, componentType, inTransaction);
+        Either<User, ResponseFormat> ownerResult = lifeCycleTransition.getComponentOwner(component, componentType);
         if (ownerResult.isRight()) {
             return Either.right(ownerResult.right().value());
         }
@@ -308,29 +340,43 @@ public class LifecycleBusinessLogic {
         if (stateValidationResult.isRight()) {
             log.error("Failed to validateBeforeTransition");
             errorResponse = stateValidationResult.right().value();
-            componentUtils.auditComponent(errorResponse, modifier, component, lifeCycleTransition.getAuditingAction(), componentType,
-                    ResourceAuditData.newBuilder().version(resourceCurrVersion).state(oldState.name()).build(), changeInfo.getUserRemarks());
+            componentUtils.auditComponent(errorResponse, modifier, component, lifeCycleTransition.getAuditingAction(),
+                    new ResourceCommonInfo(componentType.getValue()),
+                    ResourceVersionInfo.newBuilder()
+                            .version(resourceCurrVersion)
+                            .state(oldState.name())
+                            .build(),
+                    changeInfo.getUserRemarks());
             return Either.right(errorResponse);
         }
-
+        
         Either<? extends Component, ResponseFormat> operationResult = lifeCycleTransition.changeState(componentType, component, bl, modifier, owner, false, inTransaction);
 
         if (operationResult.isRight()) {
             errorResponse = operationResult.right().value();
             log.info("audit before sending error response");
             componentUtils.auditComponentAdmin(errorResponse, modifier, component, lifeCycleTransition.getAuditingAction(), componentType,
-                     ResourceAuditData.newBuilder().state(oldState.name()).version(resourceCurrVersion).build());
+                     ResourceVersionInfo.newBuilder()
+                             .state(oldState.name())
+                             .version(resourceCurrVersion)
+                             .build());
 
             return Either.right(errorResponse);
         }
         Component resourceAfterOperation = operationResult.left().value();
-        componentUtils.auditComponent(componentUtils.getResponseFormat(ActionStatus.OK), modifier, resourceAfterOperation, lifeCycleTransition.getAuditingAction(), componentType,
-                ResourceAuditData.newBuilder().state(oldState.name()).version(resourceCurrVersion).build(), changeInfo.getUserRemarks());
+        componentUtils.auditComponent(componentUtils.getResponseFormat(ActionStatus.OK), modifier, resourceAfterOperation,
+                lifeCycleTransition.getAuditingAction(), new ResourceCommonInfo(componentType.getValue()),
+                ResourceVersionInfo.newBuilder()
+                        .state(oldState.name())
+                        .version(resourceCurrVersion)
+                        .build(),
+                changeInfo.getUserRemarks());
         return operationResult;
 
     }
 
-    private Either<? extends Component, ResponseFormat> getComponentForChange(ComponentTypeEnum componentType, String componentId, User modifier, LifeCycleTransition lifeCycleTransition, LifecycleChangeInfoWithAction changeInfo) {
+
+       private Either<? extends Component, ResponseFormat> getComponentForChange(ComponentTypeEnum componentType, String componentId, User modifier, LifeCycleTransition lifeCycleTransition, LifecycleChangeInfoWithAction changeInfo) {
 
         Either<? extends Component, StorageOperationStatus> eitherResourceResponse = toscaOperationFacade.getToscaElement(componentId);
 
@@ -339,7 +385,8 @@ public class LifecycleBusinessLogic {
             ActionStatus actionStatus = componentUtils.convertFromStorageResponse(eitherResourceResponse.right().value(), componentType);
             errorResponse = componentUtils.getResponseFormat(actionStatus, Constants.EMPTY_STRING);
             log.debug("audit before sending response");
-            componentUtils.auditComponent(errorResponse, modifier, lifeCycleTransition.getAuditingAction(), componentId, componentType, changeInfo.getUserRemarks());
+            componentUtils.auditComponent(errorResponse, modifier, lifeCycleTransition.getAuditingAction(),
+                    new ResourceCommonInfo(componentId, componentType.getValue()), changeInfo.getUserRemarks());
 
             return Either.right(errorResponse);
         }
@@ -352,8 +399,11 @@ public class LifecycleBusinessLogic {
             log.debug("Component version {} is not the last version of component {}", component.getComponentMetadataDefinition().getMetadataDataDefinition().getVersion(),
                     component.getComponentMetadataDefinition().getMetadataDataDefinition().getName());
             errorResponse = componentUtils.getResponseFormat(ActionStatus.COMPONENT_HAS_NEWER_VERSION, component.getComponentMetadataDefinition().getMetadataDataDefinition().getName(), componentType.getValue().toLowerCase());
-            componentUtils.auditComponentAdmin(errorResponse, modifier, component,lifeCycleTransition.getAuditingAction(), componentType,
-                    ResourceAuditData.newBuilder().state(component.getLifecycleState().name()).version(resourceCurrVersion).build());
+            componentUtils.auditComponentAdmin(errorResponse, modifier, component, lifeCycleTransition.getAuditingAction(), componentType,
+                    ResourceVersionInfo.newBuilder()
+                            .state(component.getLifecycleState().name())
+                            .version(resourceCurrVersion)
+                            .build());
             return Either.right(errorResponse);
         }
         return Either.left(true);
@@ -405,17 +455,17 @@ public class LifecycleBusinessLogic {
     private ComponentBusinessLogic getComponentBL(ComponentTypeEnum componentTypeEnum) {
         ComponentBusinessLogic businessLogic;
         switch (componentTypeEnum) {
-            case RESOURCE:
-                businessLogic = this.resourceBusinessLogic;
-                break;
-            case SERVICE:
-                businessLogic = this.serviceBusinessLogic;
-                break;
-            case PRODUCT:
-                businessLogic = this.productBusinessLogic;
-                break;
-            default:
-                throw new IllegalArgumentException("Illegal component type:" + componentTypeEnum.getValue());
+        case RESOURCE:
+            businessLogic = this.resourceBusinessLogic;
+            break;
+        case SERVICE:
+            businessLogic = this.serviceBusinessLogic;
+            break;
+        case PRODUCT:
+            businessLogic = this.productBusinessLogic;
+            break;
+        default:
+            throw new IllegalArgumentException("Illegal component type:" + componentTypeEnum.getValue());
         }
         return businessLogic;
     }
@@ -433,41 +483,41 @@ public class LifecycleBusinessLogic {
 
         return Either.left(latestComponent);
     }
-/**
- * Performs Force certification.
- * Note that a Force certification is allowed for the first certification only,
- * as only a state and a version is promoted due a Force certification,
- * skipping other actions required if a previous certified version exists.
- * @param resource
- * @param user
- * @param lifecycleChangeInfo
- * @param inTransaction
- * @param needLock
- * @return
- */
+
+    /**
+     * Performs Force certification. Note that a Force certification is allowed for the first certification only, as only a state and a version is promoted due a Force certification, skipping other actions required if a previous certified version
+     * exists.
+     * 
    * @param resource
    * @param user
    * @param lifecycleChangeInfo
    * @param inTransaction
    * @param needLock
    * @return
    */
     public Either<Resource, ResponseFormat> forceResourceCertification(Resource resource, User user, LifecycleChangeInfoWithAction lifecycleChangeInfo, boolean inTransaction, boolean needLock) {
         Either<Resource, ResponseFormat> result = null;
         Either<ToscaElement, StorageOperationStatus> certifyResourceRes = null;
-        if(lifecycleChangeInfo.getAction() != LifecycleChanceActionEnum.CREATE_FROM_CSAR){
+        if (lifecycleChangeInfo.getAction() != LifecycleChanceActionEnum.CREATE_FROM_CSAR) {
             log.debug("Force certification is not allowed for the action {}. ", lifecycleChangeInfo.getAction());
             result = Either.right(componentUtils.getResponseFormat(ActionStatus.NOT_ALLOWED));
         }
-        if(!isFirstCertification(resource.getVersion())){
+        if (!isFirstCertification(resource.getVersion())) {
             log.debug("Failed to perform a force certification of resource{}. Force certification is allowed for the first certification only. ", resource.getName());
             result = Either.right(componentUtils.getResponseFormat(ActionStatus.NOT_ALLOWED));
         }
         // lock resource
-        if(result == null && !inTransaction && needLock){
+        if (result == null && !inTransaction && needLock) {
             log.info("lock component {}", resource.getUniqueId());
             Either<Boolean, ResponseFormat> eitherLockResource = lockComponent(resource.getComponentType(), resource);
             if (eitherLockResource.isRight()) {
                 log.error("lock component {} failed", resource.getUniqueId());
-                result =  Either.right(eitherLockResource.right().value());
+                result = Either.right(eitherLockResource.right().value());
             }
             log.info("after lock component {}", resource.getUniqueId());
         }
-        try{
-            if(result == null){
+        try {
+            if (result == null) {
                 certifyResourceRes = lifecycleOperation.forceCerificationOfToscaElement(resource.getUniqueId(), user.getUserId(), user.getUserId(), resource.getVersion());
                 if (certifyResourceRes.isRight()) {
                     StorageOperationStatus status = certifyResourceRes.right().value();
@@ -475,18 +525,18 @@ public class LifecycleBusinessLogic {
                     result = Either.right(componentUtils.getResponseFormatByResource(componentUtils.convertFromStorageResponse(status), resource));
                 }
             }
-            if(result == null){
+            if (result == null) {
                 result = Either.left(ModelConverter.convertFromToscaElement(certifyResourceRes.left().value()));
             }
         } finally {
             log.info("unlock component {}", resource.getUniqueId());
             if (!inTransaction) {
-                if(result.isLeft()){
+                if (result.isLeft()) {
                     titanDao.commit();
-                } else{
+                } else {
                     titanDao.rollback();
                 }
-                if(needLock){
+                if (needLock) {
                     NodeTypeEnum nodeType = resource.getComponentType().getNodeType();
                     log.info("During change state, another component {} has been created/updated", resource.getUniqueId());
                     graphLockOperation.unlockComponent(resource.getUniqueId(), nodeType);