/* * Copyright © 2016-2018 European Support Limited * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.openecomp.sdc.action.impl; import static org.openecomp.sdc.action.ActionConstants.ACTION_VERSIONABLE_TYPE; import static org.openecomp.sdc.action.ActionConstants.ARTIFACT_METADATA_ATTR_NAME; import static org.openecomp.sdc.action.ActionConstants.ARTIFACT_METADATA_ATTR_UUID; import static org.openecomp.sdc.action.ActionConstants.FILTER_TYPE_CATEGORY; import static org.openecomp.sdc.action.ActionConstants.FILTER_TYPE_MODEL; import static org.openecomp.sdc.action.ActionConstants.FILTER_TYPE_NAME; import static org.openecomp.sdc.action.ActionConstants.FILTER_TYPE_NONE; import static org.openecomp.sdc.action.ActionConstants.FILTER_TYPE_OPEN_ECOMP_COMPONENT; import static org.openecomp.sdc.action.ActionConstants.FILTER_TYPE_VENDOR; import static org.openecomp.sdc.action.ActionConstants.SERVICE_INSTANCE_ID; import static org.openecomp.sdc.action.ActionConstants.STATUS; import static org.openecomp.sdc.action.ActionConstants.TARGET_ENTITY_API; import static org.openecomp.sdc.action.ActionConstants.TARGET_ENTITY_DB; import static org.openecomp.sdc.action.ActionConstants.UNIQUE_ID; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_ARTIFACT_ALREADY_EXISTS; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_ARTIFACT_ALREADY_EXISTS_CODE; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_ARTIFACT_DELETE_READ_ONLY; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_ARTIFACT_DELETE_READ_ONLY_MSG; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_ARTIFACT_UPDATE_NAME_INVALID; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_ARTIFACT_UPDATE_READ_ONLY; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_ARTIFACT_UPDATE_READ_ONLY_MSG; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_CHECKIN_ON_ENTITY_LOCKED_BY_OTHER_USER; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_CHECKIN_ON_UNLOCKED_ENTITY; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_CHECKOUT_ON_LOCKED_ENTITY; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_CHECKOUT_ON_LOCKED_ENTITY_OTHER_USER; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_DELETE_ON_LOCKED_ENTITY_CODE; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_EDIT_ON_ENTITY_LOCKED_BY_OTHER_USER; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_ENTITY_NOT_EXIST; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_ENTITY_NOT_EXIST_CODE; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_ENTITY_UNIQUE_VALUE_ERROR; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_ENTITY_UNIQUE_VALUE_MSG; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_INTERNAL_SERVER_ERR_CODE; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_REQUESTED_VERSION_INVALID; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_SUBMIT_FINALIZED_ENTITY_NOT_ALLOWED; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_SUBMIT_LOCKED_ENTITY_NOT_ALLOWED; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_UNDO_CHECKOUT_ON_ENTITY_LOCKED_BY_OTHER_USER; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_UNDO_CHECKOUT_ON_UNLOCKED_ENTITY; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_UPDATE_INVALID_VERSION; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_UPDATE_NOT_ALLOWED_CODE; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_UPDATE_NOT_ALLOWED_CODE_NAME; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_UPDATE_NOT_ALLOWED_FOR_NAME; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_UPDATE_ON_UNLOCKED_ENTITY; import static org.openecomp.sdc.action.errors.ActionErrorConstants.ACTION_UPDATE_PARAM_INVALID; import static org.openecomp.sdc.action.util.ActionUtil.actionLogPostProcessor; import static org.openecomp.sdc.action.util.ActionUtil.actionLogPreProcessor; import static org.openecomp.sdc.action.util.ActionUtil.getCurrentTimeStampUtc; import static org.openecomp.sdc.versioning.dao.types.Version.VERSION_STRING_VIOLATION_MSG; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.UUID; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.openecomp.core.dao.UniqueValueDao; import org.openecomp.core.dao.UniqueValueDaoFactory; import org.openecomp.core.util.UniqueValueUtil; import org.openecomp.core.utilities.CommonMethods; import org.openecomp.core.utilities.json.JsonUtil; import org.openecomp.sdc.action.ActionConstants; import org.openecomp.sdc.action.ActionManager; import org.openecomp.sdc.action.dao.ActionArtifactDao; import org.openecomp.sdc.action.dao.ActionArtifactDaoFactory; import org.openecomp.sdc.action.dao.ActionDao; import org.openecomp.sdc.action.dao.ActionDaoFactory; import org.openecomp.sdc.action.dao.types.ActionArtifactEntity; import org.openecomp.sdc.action.dao.types.ActionEntity; import org.openecomp.sdc.action.errors.ActionErrorConstants; import org.openecomp.sdc.action.errors.ActionException; import org.openecomp.sdc.action.logging.StatusCode; import org.openecomp.sdc.action.types.Action; import org.openecomp.sdc.action.types.ActionArtifact; import org.openecomp.sdc.action.types.ActionArtifactProtection; import org.openecomp.sdc.action.types.ActionStatus; import org.openecomp.sdc.action.types.ActionSubOperation; import org.openecomp.sdc.action.types.OpenEcompComponent; import org.openecomp.sdc.common.errors.CoreException; import org.openecomp.sdc.logging.api.Logger; import org.openecomp.sdc.logging.api.LoggerFactory; import org.openecomp.sdc.versioning.ActionVersioningManager; import org.openecomp.sdc.versioning.ActionVersioningManagerFactory; import org.openecomp.sdc.versioning.dao.VersionInfoDao; import org.openecomp.sdc.versioning.dao.VersionInfoDaoFactory; import org.openecomp.sdc.versioning.dao.types.UserCandidateVersion; import org.openecomp.sdc.versioning.dao.types.Version; import org.openecomp.sdc.versioning.dao.types.VersionInfoEntity; import org.openecomp.sdc.versioning.errors.EntityNotExistErrorBuilder; import org.openecomp.sdc.versioning.errors.VersioningErrorCodes; import org.openecomp.sdc.versioning.types.VersionInfo; import org.openecomp.sdc.versioning.types.VersionableEntityAction; import org.slf4j.MDC; /** * Manager Implementation for {@link ActionManager Action Library Operations} *
* Handles Business layer validations and acts as an interface between the REST * and DAO layers. */ public class ActionManagerImpl implements ActionManager { private static final String ARTIFACT_UUID = "artifactUUID= "; private static final String BY_USER = " by user = "; private static final String WITH_VALUE = " With value = "; private static final String AND_VERSION = " and version"; private final ActionDao actionDao; private final ActionVersioningManager versioningManager; private final ActionArtifactDao actionArtifactDao; private final VersionInfoDao versionInfoDao; private final UniqueValueDao uniqueValueDao; private final Logger log = LoggerFactory.getLogger(this.getClass() .getName()); public ActionManagerImpl() { actionDao = ActionDaoFactory.getInstance().createInterface(); versioningManager = ActionVersioningManagerFactory.getInstance().createInterface(); actionArtifactDao = ActionArtifactDaoFactory.getInstance().createInterface(); versionInfoDao = VersionInfoDaoFactory.getInstance().createInterface(); actionDao.registerVersioning(ACTION_VERSIONABLE_TYPE); uniqueValueDao = UniqueValueDaoFactory.getInstance().createInterface(); } public ActionManagerImpl(ActionDao actionDao, ActionVersioningManager versioningManager, ActionArtifactDao actionArtifactDao, VersionInfoDao versionInfoDao, UniqueValueDao uniqueValueDao) { this.actionDao = actionDao; this.versioningManager = versioningManager; this.actionArtifactDao = actionArtifactDao; this.versionInfoDao = versionInfoDao; this.uniqueValueDao = uniqueValueDao; } /** * List All Major, Last Minor and Candidate version (if any) for Given Action Invariant UUID * * @param invariantId Invariant UUID of the action for which the information is required * @return List of All Major, Last Minor and Candidate version if any Of {@link Action} with given * actionInvariantUuId. * @throws ActionException Exception with an action library specific code, short description and * detailed message for the error occurred during the operation */ @Override public List getActionsByActionInvariantUuId(String invariantId) { List actions; log.debug(" entering getActionsByActionInvariantUuId with invariantID = " + invariantId); actions = actionDao.getActionsByActionInvariantUuId(invariantId != null ? invariantId.toUpperCase() : null); if (actions != null && actions.isEmpty()) { throw new ActionException(ACTION_ENTITY_NOT_EXIST_CODE, ACTION_ENTITY_NOT_EXIST); } log.debug(" exit getActionsByActionInvariantUuId with invariantID = " + invariantId); return actions; } /** * Get list of actions based on a filter criteria. If no filter is sent all * actions will be returned * * @param filterType * Filter by Vendor/Category/Model/Component/None * @param filterValue * Filter Parameter Value (Vendor ID/Category ID/Model * ID/Component ID) * @return List of {@link Action} objects based on a filter criteria
* Empty List if no records match the provided filter criteria */ @Override public List getFilteredActions(String filterType, String filterValue) { List actions; log.debug(" entering getFilteredActions By filterType = " + filterType + WITH_VALUE + filterValue); switch (filterType) { case FILTER_TYPE_NONE: // Business validation for OPENECOMP Component type fetch (if any) break; case FILTER_TYPE_VENDOR: // Business validation for vendor type fetch (if any) break; case FILTER_TYPE_CATEGORY: // Business validation for Category type fetch (if any) break; case FILTER_TYPE_MODEL: // Business validation for model type fetch (if any) break; case FILTER_TYPE_OPEN_ECOMP_COMPONENT: // Business validation for OPENECOMP Component type fetch (if any) break; case FILTER_TYPE_NAME: actions = actionDao.getFilteredActions(filterType, filterValue != null ? filterValue.toLowerCase() : null); if (actions != null && actions.isEmpty()) { throw new ActionException(ACTION_ENTITY_NOT_EXIST_CODE, ACTION_ENTITY_NOT_EXIST); } log.debug(" exit getFilteredActions By filterType = " + filterType + WITH_VALUE + filterValue); return actions; default: break; } actions = actionDao.getFilteredActions(filterType, filterValue != null ? filterValue.toLowerCase() : null); List majorMinorVersionList = getMajorMinorVersionActions(actions); Collections.sort(majorMinorVersionList); log.debug(" exit getFilteredActions By filterType = " + filterType + WITH_VALUE + filterValue); return majorMinorVersionList; } /** * Get the properties of an action version by its UUID. * * @param actionUuId * UUID of the specific action version * @return {@link Action} object corresponding the version represented by * the UUID */ @Override public Action getActionsByActionUuId(String actionUuId) { log.debug(" entering getActionsByActionUuId with actionUUID = " + actionUuId); Action action = actionDao.getActionsByActionUuId(actionUuId != null ? actionUuId.toUpperCase() : null); if (action == null) { throw new ActionException(ACTION_ENTITY_NOT_EXIST_CODE, ACTION_ENTITY_NOT_EXIST); } log.debug(" exit getActionsByActionUuId with actionUUID = " + actionUuId); return action; } /** * List OPENECOMP Components supported by Action Library. * * @return List of {@link OpenEcompComponent} objects supported by Action * Library
* Empty List if no components are found */ @Override public List getOpenEcompComponents() { return actionDao.getOpenEcompComponents(); } /** * Delete an action. * * @param actionInvariantUuId * Invariant UUID of the action to be deleted * @param user * User id of the user performing the operation */ @Override public void deleteAction(String actionInvariantUuId, String user) { try { log.debug( "entering deleteAction with actionInvariantUuId = " + actionInvariantUuId + " and user = " + user); actionLogPreProcessor(ActionSubOperation.DELETE_ACTION, TARGET_ENTITY_API); versioningManager.delete(ACTION_VERSIONABLE_TYPE, actionInvariantUuId, user); actionLogPostProcessor(StatusCode.COMPLETE); log.metrics(""); actionDao.deleteAction(actionInvariantUuId); } catch (CoreException ce) { formAndThrowException(ce); } } /** * Create a new Action. * * @param action * Action object model of the user request for creating an action * @param user * AT&T id of the user sending the create request * @return {@link Action} model object for the created action */ @Override public Action createAction(Action action, String user) { UniqueValueUtil uniqueValueUtil = new UniqueValueUtil(uniqueValueDao); try { actionLogPreProcessor(ActionSubOperation.VALIDATE_ACTION_UNIQUE_NAME, TARGET_ENTITY_API); uniqueValueUtil.validateUniqueValue(ActionConstants.UniqueValues.ACTION_NAME, action.getName()); actionLogPostProcessor(StatusCode.COMPLETE); } catch (CoreException exception) { String errorDesc = String.format(ACTION_ENTITY_UNIQUE_VALUE_MSG, ActionConstants.UniqueValues.ACTION_NAME, action.getName()); log.error(errorDesc, exception); actionLogPostProcessor(StatusCode.ERROR, ACTION_ENTITY_UNIQUE_VALUE_ERROR, errorDesc, false); throw new ActionException(ACTION_ENTITY_UNIQUE_VALUE_ERROR, errorDesc); } finally { log.metrics(""); } action.setUser(user); action.setTimestamp(getCurrentTimeStampUtc()); action.setActionInvariantUuId(CommonMethods.nextUuId()); action.setActionUuId(CommonMethods.nextUuId()); actionLogPreProcessor(ActionSubOperation.CREATE_ACTION_VERSION, TARGET_ENTITY_API); Version version = versioningManager.create(ACTION_VERSIONABLE_TYPE, action.getActionInvariantUuId(), user); actionLogPostProcessor(StatusCode.COMPLETE); log.metrics(""); action.setVersion(version.toString()); action.setStatus(ActionStatus.Locked); action = updateData(action); action = actionDao.createAction(action); actionLogPreProcessor(ActionSubOperation.CREATE_ACTION_UNIQUE_VALUE, TARGET_ENTITY_API); uniqueValueUtil.createUniqueValue(ActionConstants.UniqueValues.ACTION_NAME, action.getName()); actionLogPostProcessor(StatusCode.COMPLETE); log.metrics(""); return action; } /** * Update an existing action. * * @param action * Action object model of the user request for creating an action * @param user * AT&T id of the user sending the update request * @return {@link Action} model object for the update action */ @Override public Action updateAction(Action action, String user) { try { log.debug("entering updateAction to update action with invariantUuId = " + action.getActionInvariantUuId() + BY_USER + user); String invariantUuId = action.getActionInvariantUuId(); actionLogPreProcessor(ActionSubOperation.GET_ACTION_VERSION, TARGET_ENTITY_API); VersionInfo versionInfo = versioningManager.getEntityVersionInfo(ACTION_VERSIONABLE_TYPE, invariantUuId, user, VersionableEntityAction.Write); actionLogPostProcessor(StatusCode.COMPLETE); log.metrics(""); Version activeVersion = versionInfo.getActiveVersion(); validateActions(action, activeVersion); action.setStatus(ActionStatus.Locked); // Status will be Checkout // for update updateData(action); action.setUser(user); action.setTimestamp(getCurrentTimeStampUtc()); actionDao.updateAction(action); } catch (CoreException ce) { formAndThrowException(ce); } log.debug("exit updateAction"); return action; } /** * Checkout an existing action. * * @param invariantUuId * actionInvariantUuId of the action to be checked out * @param user * AT&T id of the user sending the checkout request * @return {@link Action} model object for the checkout action */ @Override public Action checkout(String invariantUuId, String user) { Version version = null; ActionEntity actionEntity = null; try { log.debug("entering checkout for Action with invariantUUID= " + invariantUuId + BY_USER + user); actionLogPreProcessor(ActionSubOperation.CHECKOUT_ACTION, TARGET_ENTITY_API); version = versioningManager.checkout(ACTION_VERSIONABLE_TYPE, invariantUuId, user); actionLogPostProcessor(StatusCode.COMPLETE); log.metrics(""); actionEntity = updateUniqueIdForVersion(invariantUuId, version, ActionStatus.Locked.name(), user); } catch (CoreException exception) { if (exception.code() != null && exception.code() .id() .equals(VersioningErrorCodes.CHECKOT_ON_LOCKED_ENTITY)) { actionLogPreProcessor(ActionSubOperation.GET_ACTION_VERSION, TARGET_ENTITY_DB); VersionInfoEntity versionInfoEntity = versionInfoDao .get(new VersionInfoEntity(ACTION_VERSIONABLE_TYPE, invariantUuId)); actionLogPostProcessor(StatusCode.COMPLETE); log.metrics(""); String checkoutUser = versionInfoEntity.getCandidate() .getUser(); log.debug("Actual checkout user for Action with invariantUUID= " + invariantUuId + " is = " + checkoutUser); if (!checkoutUser.equals(user)) { throw new ActionException(ACTION_CHECKOUT_ON_LOCKED_ENTITY_OTHER_USER, exception.getMessage()); } } formAndThrowException(exception); } log.debug("exit checkout for Action with invariantUUID= " + invariantUuId + BY_USER + user); return actionEntity != null ? actionEntity.toDto() : new Action(); } /** * Undo an already checked out action. * * @param invariantUuId * actionInvariantUuId of the checked out action * @param user * AT&T id of the user sending the request */ @Override public void undoCheckout(String invariantUuId, String user) { Version version; try { log.debug("entering undoCheckout for Action with invariantUUID= " + invariantUuId + BY_USER + user); actionLogPreProcessor(ActionSubOperation.GET_ACTION_VERSION, TARGET_ENTITY_DB); // Get list of uploaded artifacts in this checked out version VersionInfoEntity versionInfoEntity = versionInfoDao .get(new VersionInfoEntity(ACTION_VERSIONABLE_TYPE, invariantUuId)); actionLogPostProcessor(StatusCode.COMPLETE); log.metrics(""); if (versionInfoEntity == null) { throw new CoreException(new EntityNotExistErrorBuilder(ACTION_VERSIONABLE_TYPE, invariantUuId).build()); } UserCandidateVersion candidate = versionInfoEntity.getCandidate(); Version activeVersion; if (candidate != null) { activeVersion = candidate.getVersion(); } else { activeVersion = versionInfoEntity.getActiveVersion(); } actionLogPreProcessor(ActionSubOperation.GET_ACTIONENTITY_BY_VERSION, TARGET_ENTITY_DB); Action action = actionDao.get(new ActionEntity(invariantUuId, activeVersion)) .toDto(); actionLogPostProcessor(StatusCode.COMPLETE); log.metrics(""); // Perform undo checkout on the action actionLogPreProcessor(ActionSubOperation.UNDO_CHECKOUT_ACTION, TARGET_ENTITY_API); version = versioningManager.undoCheckout(ACTION_VERSIONABLE_TYPE, invariantUuId, user); actionLogPostProcessor(StatusCode.COMPLETE); log.metrics(""); if (version.equals(new Version(0, 0))) { actionLogPreProcessor(ActionSubOperation.DELETE_UNIQUEVALUE, TARGET_ENTITY_API); UniqueValueUtil uniqueValueUtil = new UniqueValueUtil(uniqueValueDao); uniqueValueUtil.deleteUniqueValue(ActionConstants.UniqueValues.ACTION_NAME, action.getName()); actionLogPostProcessor(StatusCode.COMPLETE); log.metrics(""); actionLogPreProcessor(ActionSubOperation.DELETE_ACTIONVERSION, TARGET_ENTITY_DB); // Added for the case where Create->Undo_Checkout->Checkout // should not get the action versionInfoDao.delete(new VersionInfoEntity(ACTION_VERSIONABLE_TYPE, invariantUuId)); actionLogPostProcessor(StatusCode.COMPLETE); log.metrics(""); } List currentVersionArtifacts = action.getArtifacts(); // Delete the artifacts from action_artifact table (if any) if (CollectionUtils.isNotEmpty(currentVersionArtifacts) && currentVersionArtifacts.size() > 0) { for (ActionArtifact artifact : currentVersionArtifacts) { ActionArtifactEntity artifactDeleteEntity = new ActionArtifactEntity(artifact.getArtifactUuId(), getEffectiveVersion(activeVersion.toString())); actionLogPreProcessor(ActionSubOperation.DELETE_ARTIFACT, TARGET_ENTITY_DB); actionArtifactDao.delete(artifactDeleteEntity); actionLogPostProcessor(StatusCode.COMPLETE); log.metrics(""); } } } catch (CoreException exception) { formAndThrowException(exception); } log.debug("exit undoCheckout for Action with invariantUUID= " + invariantUuId + BY_USER + user); } /** * Checkin a checked out action. * * @param invariantUuId * actionInvariantUuId of the checked out action * @param user * AT&T id of the user sending the request * @return {@link Action} model object for the updated action */ @Override public Action checkin(String invariantUuId, String user) { Version version = null; ActionEntity actionEntity = null; try { log.debug("entering checkin for Action with invariantUUID= " + invariantUuId + BY_USER + user); actionLogPreProcessor(ActionSubOperation.CHECKIN_ACTION, TARGET_ENTITY_API); version = versioningManager.checkin(ACTION_VERSIONABLE_TYPE, invariantUuId, user, null); actionLogPostProcessor(StatusCode.COMPLETE); log.metrics(""); actionEntity = updateStatusForVersion(invariantUuId, version, ActionStatus.Available.name(), user); } catch (CoreException exception) { formAndThrowException(exception); } log.debug("exit checkin for Action with invariantUUID= " + invariantUuId + BY_USER + user); return actionEntity != null ? actionEntity.toDto() : new Action(); } /** * Submit a checked in action. * * @param invariantUuId * actionInvariantUuId of the checked in action * @param user * AT&T id of the user sending the request * @return {@link Action} model object for the updated action */ @Override public Action submit(String invariantUuId, String user) { Version version = null; ActionEntity actionEntity = null; try { log.debug("entering submit for Action with invariantUUID= " + invariantUuId + BY_USER + user); actionLogPreProcessor(ActionSubOperation.SUBMIT_ACTION, TARGET_ENTITY_API); version = versioningManager.submit(ACTION_VERSIONABLE_TYPE, invariantUuId, user, null); actionLogPostProcessor(StatusCode.COMPLETE); log.metrics(""); actionEntity = updateUniqueIdForVersion(invariantUuId, version, ActionStatus.Final.name(), user); } catch (CoreException exception) { formAndThrowException(exception); } log.debug("exit submit for Action with invariantUUID= " + invariantUuId + BY_USER + user); return actionEntity != null ? actionEntity.toDto() : new Action(); } /** * Download an artifact of an action. * * @param artifactUuId * {@link ActionArtifact} object representing the artifact and * its metadata * @param actionUuId * UUID of the action for which the artifact has to be downloaded * @return downloaded action artifact object */ @Override public ActionArtifact downloadArtifact(String actionUuId, String artifactUuId) { log.debug(" entering downloadArtifact with actionUUID= " + actionUuId + " and artifactUUID= " + artifactUuId); Action action = actionDao.getActionsByActionUuId(actionUuId); ActionArtifact actionArtifact; if (action != null) { MDC.put(SERVICE_INSTANCE_ID, action.getActionInvariantUuId()); List artifacts = action.getArtifacts(); String actionVersion = action.getVersion(); int effectiveVersion = getEffectiveVersion(actionVersion); ActionArtifact artifactMetadata = getArtifactMetadataFromAction(artifacts, ARTIFACT_METADATA_ATTR_UUID, artifactUuId); if (artifactMetadata != null) { String artifactName = artifactMetadata.getArtifactName(); actionArtifact = actionArtifactDao.downloadArtifact(effectiveVersion, artifactUuId); actionArtifact.setArtifactName(artifactName); } else { throw new ActionException(ActionErrorConstants.ACTION_ARTIFACT_ENTITY_NOT_EXIST_CODE, ActionErrorConstants.ACTION_ARTIFACT_ENTITY_NOT_EXIST); } } else { throw new ActionException(ActionErrorConstants.ACTION_ENTITY_NOT_EXIST_CODE, ActionErrorConstants.ACTION_ENTITY_NOT_EXIST); } log.debug(" exit downloadArtifact with actionUUID= " + actionUuId + " and artifactUUID= " + artifactUuId); return actionArtifact; } /** * Upload an artifact to an action. * * @param artifact * {@link ActionArtifact} object representing the artifact and * its metadata * @param actionInvariantUuId * Invariant UUID of the action to which the artifact has to be * uploaded * @param user * User ID of the user sending the request * @return Uploaded action artifact object */ @Override public ActionArtifact uploadArtifact(ActionArtifact artifact, String actionInvariantUuId, String user) { ActionArtifact uploadArtifactResponse = new ActionArtifact(); try { log.debug("entering uploadArtifact with actionInvariantUuId= " + actionInvariantUuId + "artifactName= " + artifact.getArtifactName()); actionLogPreProcessor(ActionSubOperation.GET_ACTION_VERSION, TARGET_ENTITY_DB); VersionInfo versionInfo = versioningManager.getEntityVersionInfo(ACTION_VERSIONABLE_TYPE, actionInvariantUuId, user, VersionableEntityAction.Write); actionLogPostProcessor(StatusCode.COMPLETE); log.metrics(""); Version activeVersion = versionInfo.getActiveVersion(); actionLogPreProcessor(ActionSubOperation.GET_ACTIONENTITY_BY_ACTIONINVID, TARGET_ENTITY_DB); Action action = actionDao.get(new ActionEntity(actionInvariantUuId, activeVersion)) .toDto(); actionLogPostProcessor(StatusCode.COMPLETE); log.metrics(""); String artifactUuId = generateActionArtifactUuId(action, artifact.getArtifactName()); // Check for Unique document name List actionArtifacts = action.getArtifacts(); ActionArtifact artifactMetadata = getArtifactMetadataFromAction(actionArtifacts, ARTIFACT_METADATA_ATTR_NAME, artifact.getArtifactName()); if (artifactMetadata != null) { throw new ActionException(ACTION_ARTIFACT_ALREADY_EXISTS_CODE, String.format(ACTION_ARTIFACT_ALREADY_EXISTS, actionInvariantUuId)); } // Create the artifact artifact.setArtifactUuId(artifactUuId); artifact.setTimestamp(getCurrentTimeStampUtc()); artifact.setEffectiveVersion(getEffectiveVersion(activeVersion.toString())); actionArtifactDao.uploadArtifact(artifact); // Update the action data field and timestamp addArtifactMetadataInActionData(action, artifact); // Set the response object uploadArtifactResponse.setArtifactUuId(artifact.getArtifactUuId()); } catch (CoreException ce) { formAndThrowException(ce); } log.debug("exit uploadArtifact with actionInvariantUuId= " + actionInvariantUuId + "artifactName= " + artifact.getArtifactName()); return uploadArtifactResponse; } @Override public void deleteArtifact(String actionInvariantUuId, String artifactUuId, String user) { log.debug("enter deleteArtifact with actionInvariantUuId= " + actionInvariantUuId + ARTIFACT_UUID + artifactUuId + " and user = " + user); Action action = actionDao.getLockedAction(actionInvariantUuId, user); List actionArtifacts = action.getArtifacts(); ActionArtifact artifactMetadata = getArtifactMetadataFromAction(actionArtifacts, ARTIFACT_METADATA_ATTR_UUID, artifactUuId); if (artifactMetadata == null) { throw new ActionException(ActionErrorConstants.ACTION_ARTIFACT_ENTITY_NOT_EXIST_CODE, ActionErrorConstants.ACTION_ARTIFACT_ENTITY_NOT_EXIST); } if (artifactMetadata.getArtifactProtection() .equals(ActionArtifactProtection.readOnly.name())) { throw new ActionException(ACTION_ARTIFACT_DELETE_READ_ONLY, ACTION_ARTIFACT_DELETE_READ_ONLY_MSG); } else { // Update action by removing artifact metadata String jsonData = action.getData(); List artifacts = action.getArtifacts();// action.getArtifacts(); ActionArtifact artifact = null; Iterator it = artifacts.iterator(); while (it.hasNext()) { artifact = it.next(); String artifactId = artifact.getArtifactUuId(); if (artifactId.equals(artifactUuId)) { it.remove(); } } Map dataMap = JsonUtil.json2Object(jsonData, LinkedHashMap.class); dataMap.put("artifacts", artifacts); String data = JsonUtil.object2Json(dataMap); ActionEntity actionEntity = action.toEntity(); actionEntity.setData(data); actionLogPreProcessor(ActionSubOperation.UPDATE_ACTION, TARGET_ENTITY_DB); actionDao.update(actionEntity); actionLogPostProcessor(StatusCode.COMPLETE, null, "", false); log.metrics(""); // delete Artifact if it's upload and delete action on same checkout // version String artifactName = artifactMetadata.getArtifactName(); String generatedArtifactUuId = generateActionArtifactUuId(action, artifactName); if (generatedArtifactUuId.equals(artifactUuId)) { if (artifact != null) { ActionArtifactEntity artifactDeleteEntity = new ActionArtifactEntity(artifact.getArtifactUuId(), getEffectiveVersion(action.getVersion())); actionLogPreProcessor(ActionSubOperation.DELETE_ACTION_ARTIFACT, TARGET_ENTITY_DB); actionArtifactDao.delete(artifactDeleteEntity); } actionLogPostProcessor(StatusCode.COMPLETE, null, "", false); log.metrics(""); } } log.debug("exit deleteArtifact with actionInvariantUuId= " + actionInvariantUuId + ARTIFACT_UUID + artifactUuId + " and user = " + user); } /** * Update an existing artifact. * * @param artifact * {@link ActionArtifact} object representing the artifact and * its metadata * @param actionInvariantUuId * Invariant UUID of the action to which the artifact has to be * uploaded * @param user * User ID of the user sending the request */ public void updateArtifact(ActionArtifact artifact, String actionInvariantUuId, String user) { try { log.debug("Enter updateArtifact with actionInvariantUuId= " + actionInvariantUuId + ARTIFACT_UUID + artifact.getArtifactUuId() + " and user = " + user); actionLogPreProcessor(ActionSubOperation.GET_ACTION_VERSION, TARGET_ENTITY_API); VersionInfo versionInfo = versioningManager.getEntityVersionInfo(ACTION_VERSIONABLE_TYPE, actionInvariantUuId, user, VersionableEntityAction.Write); actionLogPostProcessor(StatusCode.COMPLETE, null, "", false); log.metrics(""); Version activeVersion = versionInfo.getActiveVersion(); actionLogPreProcessor(ActionSubOperation.GET_ACTIONENTITY_BY_ACTIONINVID, TARGET_ENTITY_DB); Action action = actionDao.get(new ActionEntity(actionInvariantUuId, activeVersion)) .toDto(); actionLogPostProcessor(StatusCode.COMPLETE, null, "", false); log.metrics(""); List actionArtifacts = action.getArtifacts(); ActionArtifact artifactMetadataByUuId = getArtifactMetadataFromAction(actionArtifacts, ARTIFACT_METADATA_ATTR_UUID, artifact.getArtifactUuId()); // Check if artifact is already in action or not if (artifactMetadataByUuId == null) { throw new ActionException(ActionErrorConstants.ACTION_ARTIFACT_ENTITY_NOT_EXIST_CODE, ActionErrorConstants.ACTION_ARTIFACT_ENTITY_NOT_EXIST); } // If user tries to change artifact name if (artifact.getArtifactName() != null && !artifactMetadataByUuId.getArtifactName() .equalsIgnoreCase(artifact.getArtifactName())) { throw new ActionException(ACTION_UPDATE_NOT_ALLOWED_CODE, ACTION_ARTIFACT_UPDATE_NAME_INVALID); } byte[] payload = artifact.getArtifact(); String artifactLabel = artifact.getArtifactLabel(); String artifactCategory = artifact.getArtifactCategory(); String artifactDescription = artifact.getArtifactDescription(); String artifactProtection = artifact.getArtifactProtection(); String artifactName = artifact.getArtifactName(); // If artifact read only if (artifactMetadataByUuId.getArtifactProtection() .equals(ActionArtifactProtection.readOnly.name())) { if (artifactName != null || artifactLabel != null || artifactCategory != null || artifactDescription != null || payload != null) { throw new ActionException(ACTION_ARTIFACT_UPDATE_READ_ONLY, ACTION_ARTIFACT_UPDATE_READ_ONLY_MSG); } // Changing value from readOnly to readWrite if (artifactProtection != null && artifactProtection.equals(ActionArtifactProtection.readWrite.name())) { artifactMetadataByUuId.setArtifactProtection(ActionArtifactProtection.readWrite.name()); artifactMetadataByUuId.setTimestamp(getCurrentTimeStampUtc()); updateArtifactMetadataInActionData(action, artifactMetadataByUuId); } } else { int effectiveVersion = getEffectiveVersion(activeVersion.toString()); if (artifactLabel != null) { artifactMetadataByUuId.setArtifactLabel(artifactLabel); } if (artifactCategory != null) { artifactMetadataByUuId.setArtifactCategory(artifactCategory); } if (artifactDescription != null) { artifactMetadataByUuId.setArtifactDescription(artifactDescription); } if (artifactProtection != null) { artifactMetadataByUuId.setArtifactProtection(artifactProtection); } if (payload != null) { // get artifact data from action_artifact table for updating // the content ActionArtifact artifactContent = new ActionArtifact(); artifactContent.setArtifactUuId(artifact.getArtifactUuId()); artifactContent.setArtifact(payload); artifactContent.setEffectiveVersion(effectiveVersion); actionArtifactDao.updateArtifact(artifactContent); } // Update the action data field and timestamp artifactMetadataByUuId.setTimestamp(getCurrentTimeStampUtc()); updateArtifactMetadataInActionData(action, artifactMetadataByUuId); } log.debug("exit updateArtifact with actionInvariantUuId= " + actionInvariantUuId + ARTIFACT_UUID + artifact.getArtifactUuId() + " and user = " + user); } catch (CoreException coreException) { formAndThrowException(coreException); } } /** * Generate artifact UUID at runtime using action name and effective * version. * * @param action * {@link Action} for which the artifact is being * uploaded/updated/downloaded * @param artifactName * Artifact name * @return Generated UUID string */ private String generateActionArtifactUuId(Action action, String artifactName) { int effectiveVersion = getEffectiveVersion(action.getVersion()); // Upper case for maintaining case-insensitive behavior for the artifact // names String artifactUuIdString = action.getName() .toUpperCase() + effectiveVersion + artifactName.toUpperCase(); String generateArtifactUuId = UUID.nameUUIDFromBytes((artifactUuIdString).getBytes()) .toString(); String artifactUuId = generateArtifactUuId.replace("-", ""); return artifactUuId.toUpperCase(); } /** * Generate the effective action version for artifact operations. * * @param actionVersion * Version of the action as a string * @return Effective version to be used for artifact operations */ private int getEffectiveVersion(String actionVersion) { Version version = Version.valueOf(actionVersion); return version.getMajor() * 10000 + version.getMinor(); } /** * Update the data field of the Action object with the modified/generated * fields after an operation. * * @param action * Action object whose data field has to be updated * @return Updated {@link Action} object */ private Action updateData(Action action) { log.debug("entering updateData to update data json for action with actionuuid= " + action.getActionUuId()); Map dataMap = new LinkedHashMap<>(); dataMap.put(ActionConstants.UNIQUE_ID, action.getActionUuId()); dataMap.put(ActionConstants.VERSION, action.getVersion()); dataMap.put(ActionConstants.INVARIANTUUID, action.getActionInvariantUuId()); dataMap.put(ActionConstants.STATUS, action.getStatus() .name()); String data = action.getData(); Map currentDataMap = JsonUtil.json2Object(data, LinkedHashMap.class); dataMap.putAll(currentDataMap); data = JsonUtil.object2Json(dataMap); action.setData(data); log.debug("exit updateData"); return action; } /** * Method to add the artifact metadata in the data attribute of action * table. * * @param action * Action to which artifact is uploaded * @param artifact * Uploaded artifact object */ private void addArtifactMetadataInActionData(Action action, ActionArtifact artifact) { ActionArtifact artifactMetadata = new ActionArtifact(); artifactMetadata.setArtifactUuId(artifact.getArtifactUuId()); artifactMetadata.setArtifactName(artifact.getArtifactName()); artifactMetadata.setArtifactProtection(artifact.getArtifactProtection()); artifactMetadata.setArtifactLabel(artifact.getArtifactLabel()); artifactMetadata.setArtifactDescription(artifact.getArtifactDescription()); artifactMetadata.setArtifactCategory(artifact.getArtifactCategory()); artifactMetadata.setTimestamp(artifact.getTimestamp()); List actionArtifacts = action.getArtifacts(); if (actionArtifacts == null) { actionArtifacts = new ArrayList<>(); } actionArtifacts.add(artifactMetadata); action.setArtifacts(actionArtifacts); String currentData = action.getData(); Map currentDataMap = JsonUtil.json2Object(currentData, LinkedHashMap.class); currentDataMap.put(ActionConstants.ARTIFACTS, actionArtifacts); String updatedActionData = JsonUtil.object2Json(currentDataMap); action.setData(updatedActionData); action.setTimestamp(artifact.getTimestamp()); actionDao.updateAction(action); } /** * Get a list of last major and last minor version (no candidate) of action * from a list of actions. * * @param actions * Exhaustive list of the action versions * @return List {@link Action} of last major and last minor version (no * candidate) of action from a list of actions */ private List getMajorMinorVersionActions(List actions) { log.debug(" entering getMajorMinorVersionActions for actions "); List list = new LinkedList<>(); actionLogPreProcessor(ActionSubOperation.GET_VERSIONINFO_FOR_ALL_ACTIONS, TARGET_ENTITY_API); Map actionVersionMap = versioningManager.listEntitiesVersionInfo(ACTION_VERSIONABLE_TYPE, "", VersionableEntityAction.Read); actionLogPostProcessor(StatusCode.COMPLETE); log.metrics(""); for (Action action : actions) { if (action.getStatus() == ActionStatus.Deleted) { continue; } VersionInfo actionVersionInfo = actionVersionMap.get(action.getActionInvariantUuId()); if (actionVersionInfo.getActiveVersion() != null && actionVersionInfo.getActiveVersion() .equals(Version.valueOf(action.getVersion()))) { list.add(action); } else if (actionVersionInfo.getLatestFinalVersion() != null && actionVersionInfo.getLatestFinalVersion() .equals(Version.valueOf(action.getVersion())) && !actionVersionInfo.getLatestFinalVersion() .equals(actionVersionInfo.getActiveVersion())) { list.add(action); } } log.debug(" exit getMajorMinorVersionActions for actions "); return list; } /** * CoreException object wrapper from Version library to Action Library * Exception. * * @param exception * CoreException object from version library */ private void formAndThrowException(CoreException exception) { log.debug("entering formAndThrowException with input CoreException =" + exception.code() .id() + " " + exception.getMessage()); String errorDescription = exception.getMessage(); String errorCode = exception.code() .id(); ActionException actionException = new ActionException(); switch (errorCode) { case VersioningErrorCodes.VERSIONABLE_ENTITY_NOT_EXIST: actionException.setErrorCode(ACTION_ENTITY_NOT_EXIST_CODE); actionException.setDescription(ACTION_ENTITY_NOT_EXIST); break; case VersioningErrorCodes.CHECKOT_ON_LOCKED_ENTITY: actionException.setErrorCode(ACTION_CHECKOUT_ON_LOCKED_ENTITY); actionException.setDescription(errorDescription); break; case VersioningErrorCodes.CHECKIN_ON_UNLOCKED_ENTITY: actionException.setErrorCode(ACTION_CHECKIN_ON_UNLOCKED_ENTITY); actionException.setDescription(errorDescription); break; case VersioningErrorCodes.SUBMIT_FINALIZED_ENTITY_NOT_ALLOWED: actionException.setErrorCode(ACTION_SUBMIT_FINALIZED_ENTITY_NOT_ALLOWED); actionException.setDescription(errorDescription); break; case VersioningErrorCodes.SUBMIT_LOCKED_ENTITY_NOT_ALLOWED: actionException.setErrorCode(ACTION_SUBMIT_LOCKED_ENTITY_NOT_ALLOWED); actionException.setDescription(errorDescription); break; case VersioningErrorCodes.UNDO_CHECKOUT_ON_UNLOCKED_ENTITY: actionException.setErrorCode(ACTION_UNDO_CHECKOUT_ON_UNLOCKED_ENTITY); actionException.setDescription(errorDescription); break; case VersioningErrorCodes.EDIT_ON_ENTITY_LOCKED_BY_OTHER_USER: actionException.setErrorCode(ACTION_EDIT_ON_ENTITY_LOCKED_BY_OTHER_USER); actionException.setDescription(errorDescription.replace("edit", "updat")); break; case VersioningErrorCodes.CHECKIN_ON_ENTITY_LOCKED_BY_OTHER_USER: actionException.setErrorCode(ACTION_CHECKIN_ON_ENTITY_LOCKED_BY_OTHER_USER); actionException.setDescription(errorDescription); break; case VersioningErrorCodes.UNDO_CHECKOUT_ON_ENTITY_LOCKED_BY_OTHER_USER: actionException.setErrorCode(ACTION_UNDO_CHECKOUT_ON_ENTITY_LOCKED_BY_OTHER_USER); actionException.setDescription(errorDescription); break; case VersioningErrorCodes.EDIT_ON_UNLOCKED_ENTITY: actionException.setErrorCode(ACTION_UPDATE_ON_UNLOCKED_ENTITY); actionException.setDescription(errorDescription.replace("edit", "update")); break; case VersioningErrorCodes.DELETE_ON_LOCKED_ENTITY: actionException.setErrorCode(ACTION_DELETE_ON_LOCKED_ENTITY_CODE); actionException.setDescription(errorDescription); break; default: actionException.setErrorCode(ACTION_INTERNAL_SERVER_ERR_CODE); actionException.setDescription(exception.getMessage()); } // Todo - Uncomment only if class to be added in ERROR Log /* * actionErrorLogProcessor(CategoryLogLevel.ERROR, * actionException.getErrorCode(), actionException.getDescription()); * log.error(""); */ log.debug("exit formAndThrowException with ActionException =" + actionException.getErrorCode() + " " + actionException.getDescription()); throw actionException; } /** * Validates an action object for business layer validations before an * update operation. * * @param action * Action object to be validated * @param activeVersion * Active version of the actoin object */ private void validateActions(Action action, Version activeVersion) { try { // Set version if not already available in input request // If version set in input compare it with version from DB if (StringUtils.isEmpty(action.getVersion())) { action.setVersion(activeVersion.toString()); } else { if (!activeVersion.equals(Version.valueOf(action.getVersion()))) { throw new ActionException(ACTION_UPDATE_INVALID_VERSION, String.format(ACTION_REQUESTED_VERSION_INVALID, action.getVersion())); } } String invariantUuId = action.getActionInvariantUuId(); Version version = Version.valueOf(action.getVersion()); Action existingAction = getActions(invariantUuId, version); if (existingAction == null || existingAction.getActionInvariantUuId() == null) { throw new ActionException(ACTION_ENTITY_NOT_EXIST_CODE, ACTION_ENTITY_NOT_EXIST); } List invalidParameters = new LinkedList<>(); // Prevent update of name, version and id fields if (!existingAction.getName() .equals(action.getName())) { throw new ActionException(ACTION_UPDATE_NOT_ALLOWED_CODE_NAME, ACTION_UPDATE_NOT_ALLOWED_FOR_NAME); } if (!StringUtils.isEmpty(action.getActionUuId()) && !existingAction.getActionUuId() .equals(action.getActionUuId())) { invalidParameters.add(UNIQUE_ID); } if (action.getStatus() != null && (existingAction.getStatus() != action.getStatus())) { invalidParameters.add(STATUS); } if (!invalidParameters.isEmpty()) { throw new ActionException(ACTION_UPDATE_NOT_ALLOWED_CODE, String.format(ACTION_UPDATE_PARAM_INVALID, StringUtils.join(invalidParameters, ", "))); } action.setActionUuId(existingAction.getActionUuId()); } catch (IllegalArgumentException iae) { String message = iae.getMessage(); if (message == VERSION_STRING_VIOLATION_MSG) { throw new ActionException(ACTION_UPDATE_NOT_ALLOWED_CODE, message); } else { throw iae; } } } /** * Get an action version entity object. * * @param invariantUuId * Invariant UUID of the action * @param version * Version of the action * @return {@link ActionEntity} object of the action version */ private ActionEntity getActionsEntityByVersion(String invariantUuId, Version version) { log.debug("entering getActionsEntityByVersion with invariantUUID= " + invariantUuId + AND_VERSION + version); ActionEntity entity = null; if (version != null) { actionLogPreProcessor(ActionSubOperation.GET_ACTIONENTITY_BY_VERSION, TARGET_ENTITY_DB); entity = actionDao .get(new ActionEntity(invariantUuId != null ? invariantUuId.toUpperCase() : null, version)); actionLogPostProcessor(StatusCode.COMPLETE); log.metrics(""); } log.debug("exit getActionsEntityByVersion with invariantUuId= " + invariantUuId + AND_VERSION + version); return entity; } /** * Get an action version object. * * @param invariantUuId * Invariant UUID of the action * @param version * Version of the action * @return {@link Action} object of the action version */ private Action getActions(String invariantUuId, Version version) { ActionEntity actionEntity = getActionsEntityByVersion( invariantUuId != null ? invariantUuId.toUpperCase() : null, version); return actionEntity != null ? actionEntity.toDto() : new Action(); } /** * Create and set the Unique ID in for an action version row. * * @param invariantUuId * Invariant UUID of the action * @param version * Version of the action * @param status * Status of the action * @param user * AT&T id of the user sending the request * @return {@link ActionEntity} object of the action version */ private ActionEntity updateUniqueIdForVersion(String invariantUuId, Version version, String status, String user) { log.debug("entering updateUniqueIdForVersion to update action with invariantUuId= " + invariantUuId + " with version,status and user as ::" + version + " " + status + " " + user); // generate UUID AND update for newly created entity row ActionEntity actionEntity = getActionsEntityByVersion(invariantUuId, version); if (actionEntity != null) { log.debug("Found action to be updated"); String data = actionEntity.getData(); String uniqueId = CommonMethods.nextUuId(); Map dataMap = JsonUtil.json2Object(data, LinkedHashMap.class); dataMap.put(ActionConstants.UNIQUE_ID, uniqueId); dataMap.put(ActionConstants.VERSION, version.toString()); dataMap.put(ActionConstants.STATUS, status); data = JsonUtil.object2Json(dataMap); actionEntity.setData(data); actionEntity.setActionUuId(uniqueId); actionEntity.setStatus(status); actionEntity.setUser(user); actionEntity.setTimestamp(getCurrentTimeStampUtc()); actionLogPreProcessor(ActionSubOperation.UPDATE_ACTION, TARGET_ENTITY_DB); actionDao.update(actionEntity); actionLogPostProcessor(StatusCode.COMPLETE); log.metrics(""); } log.debug("exit updateUniqueIdForVersion to update action with invariantUUID= " + invariantUuId); return actionEntity; } /** * Set the status for an action version row. * * @param invariantUuId * Invariant UUID of the action * @param version * Version of the action * @param status * Status of the action * @param user * AT&T id of the user sending the request * @return {@link ActionEntity} object of the action version */ private ActionEntity updateStatusForVersion(String invariantUuId, Version version, String status, String user) { log.debug("entering updateStatusForVersion with invariantUuId= " + invariantUuId + AND_VERSION + version + " for updating status " + status + " by user " + user); ActionEntity actionEntity = getActionsEntityByVersion(invariantUuId, version); if (actionEntity != null) { String data = actionEntity.getData(); Map dataMap = JsonUtil.json2Object(data, LinkedHashMap.class); dataMap.put(ActionConstants.STATUS, status); data = JsonUtil.object2Json(dataMap); actionEntity.setData(data); actionEntity.setStatus(status); actionEntity.setUser(user); actionEntity.setTimestamp(getCurrentTimeStampUtc()); actionLogPreProcessor(ActionSubOperation.UPDATE_ACTION, TARGET_ENTITY_DB); actionDao.update(actionEntity); actionLogPostProcessor(StatusCode.COMPLETE); log.metrics(""); } log.debug("exit updateStatusForVersion with invariantUuId= " + invariantUuId + AND_VERSION + version + " for updating status " + status + " by user " + user); return actionEntity; } /** * Gets an artifact from the action artifact metadata by artifact name. * * @param actionArtifactList * Action's existing artifact list * @param artifactFilterType * Search criteria for artifact in action artifact metadata * @param artifactFilterValue * Value of Search parameter * @return Artifact metadata object if artifact is present in action and * null otherwise */ private ActionArtifact getArtifactMetadataFromAction(List actionArtifactList, String artifactFilterType, String artifactFilterValue) { ActionArtifact artifact = null; if (actionArtifactList != null && !actionArtifactList.isEmpty()) { for (ActionArtifact entry : actionArtifactList) { switch (artifactFilterType) { case ARTIFACT_METADATA_ATTR_UUID: String artifactUuId = entry.getArtifactUuId(); if (artifactUuId != null && artifactUuId.equals(artifactFilterValue)) { artifact = entry; break; } break; case ARTIFACT_METADATA_ATTR_NAME: String existingArtifactName = entry.getArtifactName() .toLowerCase(); if (existingArtifactName.equals(artifactFilterValue.toLowerCase())) { artifact = entry; break; } break; default: } } } return artifact; } /** * Method to update the artifact metadata in the data attribute of action * table. * * @param action * Action to which artifact is uploaded * @param updatedArtifact * updated artifact object */ private void updateArtifactMetadataInActionData(Action action, ActionArtifact updatedArtifact) { for (ActionArtifact entry : action.getArtifacts()) { if (entry.getArtifactUuId() .equals(updatedArtifact.getArtifactUuId())) { entry.setArtifactLabel(updatedArtifact.getArtifactLabel()); entry.setArtifactCategory(updatedArtifact.getArtifactCategory()); entry.setArtifactDescription(updatedArtifact.getArtifactDescription()); entry.setArtifactProtection(updatedArtifact.getArtifactProtection()); entry.setTimestamp(updatedArtifact.getTimestamp()); break; } } String data = action.getData(); Map map = JsonUtil.json2Object(data, LinkedHashMap.class); map.put(ActionConstants.ARTIFACTS, action.getArtifacts()); String updatedActionData = JsonUtil.object2Json(map); action.setData(updatedActionData); action.setTimestamp(updatedArtifact.getTimestamp()); actionDao.updateAction(action); } }