From d475c747074832659db7d2e09768a3f7ccd7206a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20=C5=BBurek?= Date: Wed, 28 Sep 2022 11:31:32 +0200 Subject: [PATCH] ACS-3563 Workflow Licence Check (#1422) --- .../repo/workflow/WorkflowDeployer.java | 33 +++++++-- .../ActivitiWorkflowManagerFactory.java | 9 ++- .../workflow/FailedWorkflowDeployment.java | 71 +++++++++++++++++++ .../resources/alfresco/bootstrap-context.xml | 40 +++++------ 4 files changed, 124 insertions(+), 29 deletions(-) create mode 100644 repository/src/main/java/org/alfresco/service/cmr/workflow/FailedWorkflowDeployment.java diff --git a/repository/src/main/java/org/alfresco/repo/workflow/WorkflowDeployer.java b/repository/src/main/java/org/alfresco/repo/workflow/WorkflowDeployer.java index e99e943836..dc4e057e6c 100644 --- a/repository/src/main/java/org/alfresco/repo/workflow/WorkflowDeployer.java +++ b/repository/src/main/java/org/alfresco/repo/workflow/WorkflowDeployer.java @@ -2,7 +2,7 @@ * #%L * Alfresco Repository * %% - * Copyright (C) 2005 - 2016 Alfresco Software Limited + * Copyright (C) 2005 - 2022 Alfresco Software Limited * %% * This file is part of the Alfresco software. * If the software was purchased under a paid Alfresco license, the terms of @@ -46,6 +46,7 @@ import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.Path; import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.search.SearchService; +import org.alfresco.service.cmr.workflow.FailedWorkflowDeployment; import org.alfresco.service.cmr.workflow.WorkflowAdminService; import org.alfresco.service.cmr.workflow.WorkflowDefinition; import org.alfresco.service.cmr.workflow.WorkflowDeployment; @@ -62,11 +63,14 @@ import org.springframework.core.io.ClassPathResource; import org.springframework.extensions.surf.util.AbstractLifecycleBean; import javax.transaction.UserTransaction; +import java.io.InputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Properties; +import java.util.function.Supplier; /** * Alfresco bootstrap Process deployment. @@ -314,8 +318,10 @@ public class WorkflowDeployer extends AbstractLifecycleBean } else { - WorkflowDeployment deployment = workflowService.deployDefinition(engineId, workflowResource.getInputStream(), mimetype, workflowResource.getFilename(), true); - logDeployment(location, deployment); + final InputStream workflowInputStream = workflowResource.getInputStream(); + final Optional possibleDeployment = tryToDeploy(() -> + workflowService.deployDefinition(engineId, workflowInputStream, mimetype, workflowResource.getFilename(), true)); + possibleDeployment.ifPresent(deployment -> logDeployment(location, deployment)); } } else @@ -402,10 +408,9 @@ public class WorkflowDeployer extends AbstractLifecycleBean else { // deploy / re-deploy - WorkflowDeployment deployment = workflowService.deployDefinition(nodeRef); - logDeployment(nodeRef, deployment); - if (deployment != null) + tryToDeploy(() -> workflowService.deployDefinition(nodeRef)).ifPresent(deployment -> { + logDeployment(nodeRef, deployment); WorkflowDefinition def = deployment.getDefinition(); // Update the meta data for the model @@ -424,7 +429,7 @@ public class WorkflowDeployer extends AbstractLifecycleBean } nodeService.setProperties(nodeRef, props); - } + }); } } else @@ -441,6 +446,20 @@ public class WorkflowDeployer extends AbstractLifecycleBean } } + private Optional tryToDeploy(Supplier workflowDeployment) + { + final WorkflowDeployment deployment = workflowDeployment.get(); + final Optional possibleFailure = FailedWorkflowDeployment.getFailure(deployment); + + if (possibleFailure.isEmpty()) + { + return Optional.ofNullable(deployment); + } + + logger.warn("Failed to deploy a workflow. " + possibleFailure.get()); + return Optional.empty(); + } + /** * Validate that the workflow definition node is a child of the correct * workflow location node, e.g. "/Company Home/Data Dictionary/Workflows" diff --git a/repository/src/main/java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowManagerFactory.java b/repository/src/main/java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowManagerFactory.java index ca888b9846..ca59302b18 100644 --- a/repository/src/main/java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowManagerFactory.java +++ b/repository/src/main/java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowManagerFactory.java @@ -2,7 +2,7 @@ * #%L * Alfresco Repository * %% - * Copyright (C) 2005 - 2016 Alfresco Software Limited + * Copyright (C) 2005 - 2022 Alfresco Software Limited * %% * This file is part of the Alfresco software. * If the software was purchased under a paid Alfresco license, the terms of @@ -105,7 +105,7 @@ public class ActivitiWorkflowManagerFactory implements FactoryBean. + * #L% + */ +package org.alfresco.service.cmr.workflow; + +import java.util.Optional; + +/** + * The goal of this class is to provide a support for workflow deployment failure. Since {@link WorkflowDeployment} is + * part of the public API we don't want to change it. + */ +public final class FailedWorkflowDeployment +{ + private FailedWorkflowDeployment() + { + //no instantiation + } + + public static WorkflowDeployment deploymentForbidden(String workflowName, String reason) + { + return new DeploymentFailure(workflowName, reason); + } + + public static Optional getFailure(WorkflowDeployment workflowDeployment) + { + if (!(workflowDeployment instanceof DeploymentFailure)) + { + return Optional.empty(); + } + + return Optional.of(workflowDeployment.getProblems()[0]); + } + + private static class DeploymentFailure extends WorkflowDeployment + { + private static final String UNDEFINED = "undefined"; + + private DeploymentFailure(String workflowName, String problemDescription) + { + super(failedDefinition(workflowName), problemDescription); + } + + private static WorkflowDefinition failedDefinition(String workflowName) + { + final String definitionName = workflowName == null ? UNDEFINED : workflowName; + return new WorkflowDefinition(UNDEFINED, definitionName, UNDEFINED, UNDEFINED, UNDEFINED, null); + } + } +} diff --git a/repository/src/main/resources/alfresco/bootstrap-context.xml b/repository/src/main/resources/alfresco/bootstrap-context.xml index 31d9da6957..40868b38c4 100644 --- a/repository/src/main/resources/alfresco/bootstrap-context.xml +++ b/repository/src/main/resources/alfresco/bootstrap-context.xml @@ -135,6 +135,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -255,26 +275,6 @@ - - - - - - - - - - - - - - - - - - - -